NOIP(八)

 1 #include <fstream>
 2 using namespace std;
 3 /**
 4 xzpx选择排序 
 5 思想:
 6 ①a[1]-a[n]找到最小的放到a[1]中
 7 ②a[2]-a[n]找到最小的放到a[2]中
 8 n 循环①②时排除已找到的最小值,不再参与循环,直到最后两项比较完成。 
 9 */
10 ifstream cin("xzpxin.txt");
11 ofstream cout("xzpxout.txt");
12 int main(){
13     int n,temp,k;
14     cin >> n;
15     int a[n];
16     //输入 
17     for(int i = 1;i <= n;i++){
18         cin >> a[i];
19     }
20     //算法
21     //49 38 65 97 76 13 27 49
22     for(int i = 1;i <= n;i++){//从第一项开始 
23         k = i;//记录当前循环的那一项的位置
24         for(int j = i + 1;j <= n;j++){//从第二项开始比较
25             if(a[j] < a[k]){//如果后一项比当前最小的这一项还小,更新k值 
26                 k = j;
27             } 
28         }
29         if(k != i){//已被更新过 ,则交换 
30             temp = a[i];
31             a[i] = a[k];
32             a[k] = temp;
33         }
34     } 
35     //输出
36     for(int i = 1;i <= n;i++){
37         cout << a[i] << " ";
38     } 
39     return 0;
40 }
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 using namespace std;
 6 /**
 7     高精度加法 
 8     123
 9     456
10     8
11     49 38 65 97 76 13 27 49
12     min = a[1]; 
13 */
14 int main(){
15     char a1[100],b1[100];
16     //x进位数,j当前真正进行运算位数 
17     int a[100],b[100],c[100],lena,lenb,i,x = 0,j = 1;
18     memset(a,0,sizeof(a));//加数 
19     memset(b,0,sizeof(b));//被加数 
20     memset(c,0,sizeof(c));//
21     gets(a1);//获取第一行输入给a1数组 
22     gets(b1);//获取第二行输入给b1数组 
23     lena = strlen(a1);//a1数组的长度 
24     lenb = strlen(b1);//b1数组的长度 
25     //输入 
26     for(i = 0;i <= lena - 1;i++){
27         a[lena - i] = a1[i] - 48;//加数放入a数组 
28     }
29     for(int i = 0;i <= lenb - 1;i++){
30         b[lenb - i] = b1[i] - 48;//被加数放入b数组 
31     }
32     //核心算法
33     while(j <= lena || j <= lenb){
34         c[j] = a[j] + b[j] + x;
35         x = c[j]/10;
36         c[j]%=10;
37         j++;
38     }
39     //输出 
40     c[j] = x;
41     if(c[j] == 0){
42         j--;
43     }
44     for(i = j;i >= 1;i--){
45         cout << c[i];
46     }
47     cout << endl;
48     return 0;
49 } 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 /**
 6     高精度加法 
 7      8 5 6
 8    + 2 5 5
 9           ①1
10 int c[100];
11 void add(int a[],int b[]){
12     int i = 1,x = 0;
13     while((i <= a.length()) || (i <= b.length())){
14         c[i] = a[i] + b[i] + x;
15         ①= x进位数 = (a[i] + b[i]) / 10 
16         x = c[i]/10;//取进位的十位值 
17         //当前运算位的值
18         c[i] = c[i]%10; //取当前运算位的末位值 
19         i++; 
20     }
21     for(int i = 1;i <= c.length;i++){
22         cout << c[i];
23     }
24 }
25 */
26 
27 void add(int a[],int b[]){
28     int c[101];
29     int i = 1,x = 0;
30     while(i <= sizeof(a) || i <= sizeof(b)){
31         c[i] = a[i] + b[i] + x;
32         x = c[i] / 10;
33         c[i] %= 10;
34         i++;
35     }
36     cout << i << endl;
37 } 
38 
39 int main(){
40     int a[3] = {8,5,6};
41     int b[3] = {2,5,5};
42     add(a,b);
43     return 0;
44 } 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 /**
 6     高精度算法 
 7 */
 8 void init(int a[]){
 9     string s;
10     cin >> s;
11     int len = s.length();
12     for(int i = 1;i <= len;i++){
13         a[i] = s[len - i] - '0';//遍历 
14         cout << a[i] << " ";
15     }
16 }
17 int main(){
18     int a[10];
19     init(a);
20     return 0;
21 } 
 1 #include <fstream>
 2 #include <cstring>
 3 using namespace std;
 4 /**
 5     mppx冒泡排序 
 6     相邻两个人比较,高的留下,低的通过,一轮比完以后得到最大值 
 7 */
 8 ifstream cin("mppxin.txt");
 9 ofstream cout("mppxout.txt");
10 int main(){
11     int n,temp;
12     cin >> n;
13     int a[n];
14     //输入 
15     memset(a,0,sizeof(a));
16     for(int i = 0;i < n;i++){
17         cin >> a[i];
18     }
19     //算法
20     for(int i = n - 1;i >= 1;i--){//进行n-1轮冒泡
21         for(int j = 0;j < i;j++){//进行i轮比较 
22             if(a[j] > a[j + 1]){
23                 temp = a[j];
24                 a[j] = a[j + 1];
25                 a[j + 1] = temp;
26             }
27         } 
28     }
29     //输出
30     for(int i = 0;i < n;i++){
31         cout << a[i] << " ";
32     } 
33     return 0;
34 }
 1 #include <fstream>
 2 #include <cstring>
 3 using namespace std;
 4 /**
 5     mppx改进版冒泡排序 
 6     相邻两个人比较,高的留下,低的通过,一轮比完以后得到最大值 
 7     6
 8     1 5 2 3 4 6 
 9     
10     1 2 3 4 5 6
11 */
12 ifstream cin("mppx2in.txt");
13 ofstream cout("mppx2out.txt");
14 int main(){
15     int n;
16     bool ok;
17     cin >> n;
18     int a[n];
19     //输入 
20     for(int i = 1;i <= n;i++){
21         cin >> a[i];
22     }
23     //算法
24     for(int i = n - 1;i >= 1;i--){
25         //标志位的值都为true
26         ok = true; 
27         for(int j = 1;j <= i;j++){
28             if(a[j] > a[j + 1]){
29                 swap(a[j],a[j + 1]);
30                 ok = false;//说明已经交换过 
31             }
32         }
33         if(ok){
34             break;//没有交换则退出 
35         }
36     }
37     //输出
38     for(int i = 1;i <= n;i++){
39         cout << a[i] << " ";
40     }
41     return 0; 
42 } 
 1 #include <fstream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 /**
 6 搜索与回溯 
 7 */
 8 int main(){
 9     //框架 
10     递归回溯法算法框架【一】
11     int search(int k){
12         for(i = 1;i <= 算符种数;i++)
13         if(满足条件)
14         { 
15             保存
16             if(到目的地)输出解;
17                 else search(k + 1);下一条出路继续搜索
18             恢复:保存结果之前的状态{回溯一步} 
19     
20         }        
21     } 
22     return 0;
23 }
 1 #include <fstream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <cstdlib>
 6 using namespace std;
 7 /**
 8 素数环:从1到20这20个数摆成一个环,要求相邻两个数的和是一个素数。 
 9 【算法流程】
10     1).数据初始化
11     2).递归填数:判断第i个数填入是否合法
12     3).如果合法:填数;判断是否达到目标出口(20已填完):是:打印结果;
13         不是,递归填下一个;
14     4). 如果不合法:选择下一种可能 
15 */
16 //1).数据初始化
17 ofstream cout("sushuout.txt");
18 bool b[21] = {0};
19 int total = 0,a[21] = {0};
20 int search(int);
21 int print();
22 bool pd(int,int);
23 int main(){
24     search(1);
25     cout << total << endl;//输出总的方案数 
26     return 0;
27 }
28 /*
29     搜索算法 
30 */
31 int search(int t){
32     for(int i = 1;i <= 20;i++){
33         if(pd(a[t-1],i) && (!b[i])){//判断与前一个数是否构成素数,以及该数是否可用 
34             a[t] = i;
35             b[i] = 1;//已经用过了
36             if(t == 20){//路已经走完需要停止 
37                 if(pd(a[20],a[1])){
38                     print();//打印 
39                     //break;
40                 }
41             }else{
42                 search(t + 1);//回溯继续搜索下一个方向 
43             }
44             b[i] = 0;//不满足则标志该数可以继续使用 
45         }    
46     }
47 }
48 /*
49     输出的函数 
50 */
51 int print(){
52     total++;
53     cout << "<" << total << ">";
54     for(int j = 1;j <= 20;j++){
55         cout << a[j] << " ";
56     }
57     cout << endl;
58 }
59 /*
60     传入两个整数,判断两个数的和是否是一个质数 
61 */
62 bool pd(int x,int y){
63     int k = 2,i = x + y;
64     while(k <= sqrt(i) && i % k != 0){//循环找素数 
65         k++;
66     }
67     if(k > sqrt(i)){
68         return 1;//是素数 
69     }else{
70         return 0;//不是素数 
71     }
72 }

猜你喜欢

转载自www.cnblogs.com/huihuilaoshi/p/11255963.html