题目描述:
写个算法,对2个小于1000000000的输入,求结果。
特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5
输入:
两个小于1000000000的数
输出:
输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。
样例输入:
123 45
样例输出:
54
源代码:
#include <stdio.h>
#define maxn 10
void Init(int a[],int b[]) //数组初始化
{
int i;
for(i=0;i<maxn;i++)
{
a[i]=0;
b[i]=0;
}
}
int Getwei(int n,int num[maxn]) //得到一个数的位数
{
int i=n;
int count=0;
while(i)
{
num[count++]=i%10;
i/=10;
}
return count;
}
int Cal(int a[],int i,int b[],int j) //进行特殊乘法计算
{
int m,n;
int sum=0;
for(m=0;m<i;m++)
{
for(n=0;n<j;n++)
sum+=(a[m]*b[n]);
}
return sum;
}
int main()
{
int a,b,result;
int numa[maxn],numb[maxn]; //numa numb数组分别保存a与b的各位数字
while(scanf("%d %d",&a,&b)!=EOF)
{
Init(numa,numb);
result=Cal(numa,Getwei(a,numa),numb,Getwei(b,numb));
printf("%d\n",result);
}
return 0;
}
程序截图:
※2. (2010年清华大学计算机研究生机试真题)整数拆分
一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。
再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。
用f(n)表示n的不同拆分的种数,例如f(7)=6.
要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入:
每组输入包括一个整数:N(1<=N<=1000000)。
输出:
对于每组数据,输出f(n)%1000000000。
样例输入:
7
样例输出:
6
【分析】奇偶讨论:
对于奇数n=2k+1:它的拆分的第一项必然是1,推敲去掉这个1,其实就一一对应于2k的拆分,即f(2k+1)=f(2k);
对于偶数n=2k:推敲有1和没有1的拆分。有1的拆分,与(2k-1)的拆分一一对应,与上方奇数的推导相同;没有1的拆分,将每项除以2,正好一一对应于k的所有拆分。即f(2k)=f(2k-1)+f(k).
须要重视f(n)会很大,不要溢出。每一项对1000000000取模。
此外,也可根据N比较小的各种情况进行归纳推理,得到方案数的变化规律。
源代码:
#include <stdio.h>
#define maxn 1000001
int f[maxn]; //保存方案总数对1000000000的模
int main()
{
int i,N;
while(scanf("%d",&N)!=EOF)
{
f[0]=1;
f[1]=1;
for(i=2;i<=N;i++)
{
if(i%2==0) //n为偶数时,方案数等于前一项与n/2项方案数之和再取模
f[i]=(f[i-1]+f[i/2])%1000000000;
else //n为奇数时,方案数=n-1时的情况
f[i]=f[i-1];
}
printf("%d\n",f[N]);
}
}
程序截图:
※3. (2007年北京大学计算机研究生机试真题)单词替换
题目描述:
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入:
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格.
输出:
每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。
样例输入:
You want someone to help you
You
I
样例输出:
I want someone to help you
源代码:
#include <stdio.h>
#include <string.h>
#define maxlen 105
void Match(char s[],char a[],char b[])
{
int i=0,j=0,k;
int start=0,end=0;
int flag;
while(s[i]!='\0')
{
flag=0;
if(s[i]==a[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
end=i;
}
if(a[j]=='\0' && (s[i]==' ' || s[i]=='\0'))
{
for(k=start;k<end;k++)
printf("%c",s[k]);
for(k=0;k<strlen(b);k++)
printf("%c",b[k]);
j=0;
start=i;
end=start;
flag=1;
}
}
if(flag==0)
{
for(k=start;k<end;k++)
printf("%c",s[k]);
}
printf("\n");
}
int main()
{
char s[maxlen],a[maxlen],b[maxlen];
while(gets(s)!=NULL)
{
gets(a);
gets(b);
Match(s,a,b);
}
return 0;
}
程序截图: