本文共 3547 字,大约阅读时间需要 11 分钟。
题目如下:
这题的难点首先在于:拆分,将一个数,按照从大到小的拆分,那我可能回想着,用两个字符串数组来存数据,然后使用两次for循环来存这个值。#include#include #include #include #include #include using namespace std;//用两个字符串数组来存对应的数据,然后将位数 一个个的变成数值,存起来//可是这样的话,小于一万的,很难存出来。。。,不对,是可以存出来的int main(){ char a[100]; char b[100]; int sum=0; while(scanf("%s%s",a,b)!=EOF){ int len1=strlen(a); int len2=strlen(b); for(int i=0;i
下一题
#include#include #include #include #include #include using namespace std;//这题就是进制转换的一种变形题型int main(){ int m,a,b; int res[20];//(这题排除了十六进制的可能性,所以就不用考虑出现大写的值 while(scanf("%d%d%d",&m,&a,&b)!=EOF&&m!=0){ int sum=a+b; int i=0; while(sum){ res[i]=sum%m; sum/=m; i++; } for(int j=i-1;j>=0;j--) printf("%d\n",res[j]); }}
下一题
要输入三个数,也即是将a进制的n转换为进制,其实也算是将a进制的n转换为10进制,然后将已经转换为10进制的数值再转换为b进制。 需要注意的是这段代码不适合放在codeblock上运行 13年的帖子,说code::blocks种pow函数会截断,而不是四舍五入 需要改成(int)round(pow(a,w)
#include#include #include #include #include #include using namespace std;//首先是如何将一个进制转化为十进制,然后是将十进制转换为对应进制int main(){ int a,b; char Str[100]; char res[100]; while(scanf("%d%s%d",&a,Str,&b)!=EOF){ int sum=0;//用来存十进制 //一个进制转化内十进制主要是要 每一位相加乘以那个进制的次数 //并且在这题中a,A都是一样的 int len1=strlen(Str); int w=0;//这个是用来定位的 for(int i=len1-1;i>=0;i--){ //这里需要注意,从后往前的 //要对这个值进行判断 if(Str[i]>='A'&&Str[i]<='Z') sum=sum+(Str[i]-'A'+10)*pow(a,w);//这就是转换为十进制的方法 else if(Str[i]>='a'&&Str[i]<='z') sum=sum+(Str[i]-'a'+10)*pow(a,w); else if(Str[i]>='0'&&Str[i]<='9') sum=sum+(Str[i]-'0')*pow(a,w); printf("%d ",sum); w=w+1; } printf("%d\n",sum); //这样子的sum就是对应的十进制,然后开始转换为b进制的值,主要是大于十进制的话,就需要判断那个大于的值是什么 int temp,j=0; while(sum){ temp=sum%b; if(temp>10) res[j]=(temp-10+'A');//大于10 的变化 else res[j]=(temp+'0');//因为是字符,所以需要进行对应的转化 sum/=b; j++; } //再开始输出 for(int i=j-1;i>=0;i--) printf("%c",res[i]); printf("\n"); }}
下一题
#include#include #include #include #include #include using namespace std;//整除问题 给一个n和一个a 求最大的k使得n的阶乘,能被a的k次整除但是不能被a的k加一次整除//写一个方法求阶乘int jie(int x){ int sum=1; for(int i=1;i<=x;i++) sum*=i; return sum;}int main(){ //我的思路可能就是直接暴力 然后判断一个最大值 int n,a; scanf("%d%d",&n,&a); int mmax=0; for(int i=1;i<10;i++){ int x1=(int)round(pow(a,i)); int x2=(int)round(pow(a,i+1)); if(jie(n)%x1==0 &&jie(n)%x2!=0){ //再满足条件的情况之下,并且大于当前最大值 if(i>mmax) mmax=i; } } printf("%d",mmax);}
下一题
#include#include #include #include #include #include using namespace std;//写一个加法器,位数非常大,其实也就是一个字符串之间相加的一个值//只需要创建三个字符串数组,(这样比较省力)//然后一个判断进位的值初始为0,最开始一个for循环从低位,也就是数组位置为len-1的地方//之后很可能会出现,长度不一致的情况,所以找没有变成0的那个,进行递归下去int main(){ char Str1[10000]; char Str2[10000]; char sum[10000]; //先输入对应的字符串 while(scanf("%s%s",Str1,Str2)!=EOF){ int len1=strlen(Str1); int len2=strlen(Str2); int i,j,w=0;//要注意w是从后往前的 int flag=0; for(i=len1-1,j=len2-1;j>=0&&i>=0;i--,j--){ //这里用到&&别忘记 sum[w]=Str1[i]+Str2[j]-'0'+flag;//这里-'0'其实是因为 -'0'-'0'+'0' 的缩写 前两个减去是为了让str1和str2从字符变成数字,后一个加是为了从数字变成字符 //然后开始判断 flag=0; if(sum[w]>'9'){ //要减去,并且进位 sum[w]-=10; flag=1; } w++; } //然后可能会剩余str1或者str2其中一个 while(i>=0){ sum[w]=Str1[i]+flag; flag=0; if(sum[w]>'9'){ //要减去,并且进位 sum[w]-=10; flag=1; } w++; i--; } //这两个只可能发生一个 while(j>=0){ sum[w]=Str2[j]+flag; flag=0; if(sum[w]>'9'){ //要减去,并且进位 sum[w]-=10; flag=1; } w++; j--; } //然后开始输出 从后往前输出 for(i=w-1;i>=0;i--) printf("%c",sum[i]); }}
转载地址:http://kyfen.baihongyu.com/