30天编程练习(四)
1013 求数根 题意:各个位数相加,求得的结果再各位数相加,直到取得个位数 解析:1 、要用字符串的形式输入,防止大数 2、 循环求%10,在求和 #include<iostream> #include<cstring> using namespace std; int main(){ char a[1000];
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;
}
更多推荐
所有评论(0)