2021-11-24 学习的打卡学习第二天(大数相乘/加)

今天满课,昨天3点睡的,感觉要去世了。_(:з」∠)_,今天就刷两题吧。

主要是大数,减除明天在学,注释有空在补。

大数计算是对字符数组的运用。

例题如下:

lzw的数学比lyj好得多。他们可以将巨大的整数相乘,得到非常精确的答案。。。lxy怀疑他们的答案是否正确。帮他核对lzw的答案。读入两个正整数(每个不超过40位)并计算其乘积。将其作为正常数字输出(没有额外的前导零)。
不能使用函数库里面的函数哦,手敲模板

Input

接下来两行分别给出两个数字

Output

输出两个数字相乘的结果

Sample Input

11111111111111
1111111111

Sample Output

12345679011110987654321
#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
    char a1[N],b1[N];
    int a2[N]={0},b2[N]={0},c[N]={0};
    int i=0,r=0;
    for(i=0;i<1000;i++)
    {
        a1[i]='0';
        b1[i]='0';
    }
    gets(a1);
    gets(b1);
    int n1=0,n2=0;
    n1=strlen(a1);
    n2=strlen(b1);
    for(i=0;i<n1;i++)
        a2[i]=a1[n1-i-1]-'0';
    for(i=0;i<n2;i++)
        b2[i]=b1[n2-i-1]-'0';
    for(i=0;i<n2;i++)
    {
        for(r=0;r<n1;r++)
          c[i+r]=c[i+r]+a2[r]*b2[i];
    }
    int n3=n1+n2;
    for(i=0;i<n3;i++)
    {
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
    }
    i=i-1;
    while(c[i]==0&&i>=0)
        i--;
    if(i<0)
        printf("0");
    else
    {
        for(;i>=0;i--)
            printf("%d",c[i]);
    }
    return 0;
}

加法思路雷同,附上代码:

#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
    char a1[N],b1[N];
    int a2[N]={0},b2[N]={0},c[N]={0};
    int i=0;
    for(i=0;i<1000;i++)
    {
        a1[i]='0';
        b1[i]='0';
    }
    gets(a1);
    gets(b1);
    int n1=0,n2=0;
    n1=strlen(a1);
    n2=strlen(b1);
    for(i=0;i<n1;i++)
        a2[i]=a1[n1-i-1]-'0';
    for(i=0;i<n2;i++)
        b2[i]=b1[n2-i-1]-'0';
    for(i=0;i<n1&&i<n2;i++)
    {
        c[i]=a2[i]+b2[i];
    }
    for(i=0;i<n1&&i<n2;i++)
    {
        if(c[i]>=10)
        {
            c[i+1]=c[i]/10+c[i+1];
            c[i]=c[i]%10;
        }
    }
    while(n1>i)
    {
        c[i]=a2[i]+c[i];
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
        i++;
    }
    while(n2>i)
    {
        c[i]=b2[i]+c[i];
        if(c[i]>=10)
        {
            c[i+1]=c[i+1]+c[i]/10;
            c[i]=c[i]%10;
        }
        i++;
    }
    while(c[i]==0&&i>=0)
        i--;
    if(i<0)
        printf("0");
    else
    {
        for(;i>=0;i--)
            printf("%d",c[i]);
    }
    return 0;
}

还有一道桶排序的应用,例题如下:

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 maxn是单词中出现次数最多的字母的出现次数, minn 是单词中出现次数最少的字母的出现次数,如果 maxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

只有一行,是一个单词,其中只可能出现小写字母,并且长度小于 100 。

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word ,那么输出“Lucky Word”,否则输出“No Answer”

第二行是一个整数,如果输入单词是 "Lucky Word" ,输出 maxn−minn 的值,否则输出 0 。

样例说明

样例1:

单词 "error" 中出现最多的字母 'r' 出现了 3 次,出现次数最少的字母出现了 1 次,3−1=2 , 2 是质数。

样例2:

单词 "olympic" 中出现最多的字母 'i' 出现了 2 次,出现次数最少的字母出现了 1 次, 2−1=1 , 1 不是质数。

Sample Input

error

Sample Output

Lucky Word
2

Sample Input 2

olympic

Sample Output 2

No Answer
0
#include<stdio.h>
#include<string.h>
int main()
{
    int maxn=-1,minn=1000;
    int i=0,n=0;
    char a[1000];
    int b[200]={0};
    gets(a);
    n=strlen(a);
    for(i=0;i<n;i++)
    {
        b[a[i]]++;
    }
    for(i=0;i<200;i++)
    {
        if(b[i]!=0)
        {
          if(maxn<b[i])
            maxn=b[i];
          if(minn>b[i])
            minn=b[i];
        }
    }
    int z,e=0;
    z=maxn-minn;
    if(z==1||z==0)
        e=1;
    for(i=2;i*i<=z;i++)
    {
        if(z%i==0)
            e=1;
    }
    if(e==0)
        printf("Lucky Word\n%d",z);
    else
        printf("No Answer\n0");
    return 0;
}

学长还教了快速幂,结构体和一些技巧。明后天巩固吧,累了。

PS:sort函数真好用~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值