30天编程练习(四)

1013 求数根

 

题意:各个位数相加,求得的结果再各位数相加,直到取得个位数

 

解析:1 、要用字符串的形式输入,防止大数     2、 循环求%10,在求和

 

 

#include<iostream>  

#include<cstring>  

using namespace std;  

  

int main(){ 

   char a[1000];  

   int i,j,sum,n;  

   while(cin>>a){  

       sum=0;  

       n=0;  

       if(strcmp(a,"0")==0) break; 

       int len=strlen(a);  

       for(i=0;i<len;i++){  

           n+=a[i]-'0';  

       }  

       do{  

            while(n){  

                sum+=n%10;  

                n/=10;  

           }  

           n=sum;  

       }while(n>9);  

       cout<<sum<<endl;  

   }  

   return 0;  

}  

 

 

 

 

1013 求两个数的最大公约数

 

解析:使用辗转相除法写出求最大公约数函数

 

 

 

#include <stdio.h>  

int select(int ,int);  

main(){ 

   int start,end,k;  

   scanf("%d%d",&start,&end);  

   k=select(start,end);  

   printf("k=%d\n",k);  

   if(k==1){  

         

       printf("%d %d good",start,end);  

   }  

   else{  

       printf("%d %d bad",start,end); 

   }  

  

}  

int select(int x,int y){  

   int max,min,r;  

   max=x>y?x:y;  

   min=x<y?x:y;  

   r=max%min;  

   printf("r=%d\n",r);  

   if(r==0){  

       printf("min=%d\n",min); 

       return min;  

   }  

   else{  

       printf("select=%d\n",select(min,r));  

       return select(min,r);  

   }  

}  

 

 

 

 

1015 枚举法

 

题意:输入一个字符串和一个数,字符串都是大写字母ABC..Z A代表1.. 找出满足的题意函数关系的字符组合,使其等于那个数

 

解析:使用dfs枚举所有排列组合

 

 

#include <iostream>  

#include <cstring>  

#include <algorithm>  

using namespace std;  

  

  

int main() 

{  

 

   int num, flag, i, j, k, l, m;  

   int tag[15];  

   char str[15], ans[8];  

   while(cin >> num >> str && num)  

   {  

       int length = strlen(str);  

       flag = 1;  

       memset(tag, 0, sizeof(tag));  

       for(i = 0; i < length; i++)  

       {  

           tag[i] = str[i] - 'A' + 1;  

       }  

       sort(tag, tag + length);             //排序  

       for(i = 0; i < length; i++)          //枚举  

       for(j = 0; j < length; j++)  

       if(j != i)  

       for(k = 0; k < length; k++)  

           if(k != j && k != i)  

           for(l = 0; l < length; l++)  

                    if(l != k && l != j && l != i)  

                    for(m = 0; m < length; m++)  

                    {  

                        if(m != l && m != k && m != j && m != i &&   

                        tag[i] - tag[j] * tag[j] + tag[k] * tag[k] * tag[k]   

                       - tag[l] * tag[l] * tag[l] * tag[l]   

                        + tag[m] * tag[m] * tag[m] * tag[m] * tag[m] == num)  

                        {  

                            flag = 0;  

                            ans[0] = tag[i] - 1 + 'A';  

                            ans[1] = tag[j] - 1 + 'A';  

                            ans[2] = tag[k] - 1 + 'A';  

                            ans[3] = tag[l] - 1 + 'A';  

                            ans[4] = tag[m] - 1 + 'A';  

                            ans[5] = '\0';  

                        }  

                    }  

       if(flag)  

           cout << "no solution" << endl;  

       else  

           cout << ans << endl;  

   }  

   return 0;  

}  

 

 

 

 

1016 素数环

 

题意:给出一个小于20的数,将1到这个数所有的数排成一个环,要求相临数和都是素数

 

解析:设置一个素数表,判断相邻数和是否在素数表中。dfs遍历所有情况,并输出。

 

#include <iostream>  

using namespace std;  

int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0};//因为数字规模比较小,因此手动打素数表  

int n; 

bool visit[25];  

int a[25]; 

void dfs(int num)  

{  

   if(num==n&&prime[a[0]+a[num-1]]) 

   {  

       for(int i=0;i<=num-1;i++)  

       {  

           if(i!=num-1)  

                cout<<a[i]<<" ";  

           else cout<<a[i];  

       }  

       cout<<endl;                     //若满足条件则输出序列 

   }  

   else                                   //否则寻找满足条件的数字 

   {  

       for(int i=2;i<=n;i++)  

       {  

           if(visit[i]==0)  

           {  

                if(prime[i+a[num-1]])  

                {  

                    visit[i]=1;  

                    a[num++] = i;  

                    dfs(num);             //深度优先搜索找出当前情况下的序列  

                    visit[i] = 0;  

                    num--;                //退回到当前节点,等到下一次循环则遍历另外一个分支  

                }  

           }  

       }  

   }  

}  

int main() 

{  

   int count=0;  

   while(cin>>n)  

   {  

       count++;  

       cout<<"Case "<<count<<":"<<endl;  

       a[0] = 1;      //圆总是以1开头  

       dfs(1);  

       cout<<endl;  

   }  

   return 0;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值