王道机试指南 P2

题目如下:
在这里插入图片描述
这题的难点首先在于:拆分,将一个数,按照从大到小的拆分,那我可能回想着,用两个字符串数组来存数据,然后使用两次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]);

    }


}

发布了88 篇原创文章 · 获赞 5 · 访问量 3536

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/105156517
p2