题目如下:
这题的难点首先在于:拆分,将一个数,按照从大到小的拆分,那我可能回想着,用两个字符串数组来存数据,然后使用两次for循环来存这个值。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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<len1;i++)
for(int j=0;j<len2;j++){
sum=sum+(a[i]-'0')*(b[j]-'0');//将每个位都暴力循环并且从字符变成整数
}
printf("%d\n",sum);
}
}
下一题
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
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]);
}
}