今天满课,昨天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函数真好用~