7-94 最长公共子串长度
一个序列中去掉若干(也可以不去掉)元素剩下的部分称为其子序列。对于给定的序列X = <x1,x2,…,xm>,称序列Z = <z1,z2,…,zk>为X的一个子序列,仅当在X中存在一个递增序号序列<i1,i2,…,ik>,对所有的j(1,2,…,k)满足 xij= zj。例如,Z = <a,b,f,c>是X = <a,b,c,f,b,c> 的一个子序列,X中相应的序号序列为 <1,2,4,6>。要求输入两个字符串,求它们的最长公共子序列(最长公共子串)的长度。
输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入两个不包含空格的字符串。
输出格式:
对于每组测试,输出最长公共子串的长度。
答案:C
#include<stdio.h>
#include<string.h>
int maxx(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
char s1[200],s2[200];
int i,j,len1,len2,dp[500][500];
while(scanf("%s%s",s1,s2)!=EOF)
{
memset(dp,0,sizeof(dp));
len1=strlen(s1);
len2=strlen(s2);
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(s1[i-1]==s2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
dp[i][j]=maxx(dp[i-1][j],dp[i][j-1]);
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}
7-95 幂次模n余1
输入一个正整数 n, 请找出满足2x mod n = 1的最小x。
输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个正整数n。
输出格式:
对于每组测试,若能找到满足2x mod n = 1的x,则在一行上输出2^x mod n = 1;否则输出 2^? mod n = 1 。其中x和n请用实际数据代替。
答案:C
#include <stdio.h>
typedef long long ll;
int main(){
ll n;
while(~scanf("%lld",&n)){
if(n<=2)
printf("2^? mod %d = 1\n",n);
else{
int x=2;
int ans=1;
while(x%n!=1 && ans<=10000){
x=2*x%n;
ans++;
}
if(ans>=10000)
printf("2^? mod %d = 1\n",n);
else
printf("2^%d mod %d = 1\n",ans,n);
}
}
return 0;
}
7-96 n!
输入一个非负整数n,求n!。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(0≤n≤10000)。
输出格式:
对于每组测试,输出整数n的阶乘。
答案:C
#include<stdio.h>
#include<string.h>
int main(){
int i,j,n,lenth,carry,tempt;
while(scanf("%d",&n)!=EOF){
int s[7201]={1};
lenth=1;
//lenth 记录数组的实际运用长度
for(i=2;i<=n;i++)
{
carry=0;
for(j=0;j<lenth;j++)
{
tempt=s[j]*i+carry;
carry=tempt/100000;
s[j]=tempt%100000;
}
while(carry)
{
s[lenth++]=carry%100000;
//如果有进位 数组运用的实际长度+1
carry/=100000;
}
}
j=lenth-1;
printf("%d",s[j--]);
//注意看好这一步!最高位的前置0不能输出,其他的前
//置0要输出
for(;j>=0;j--)
printf("%05d",s[j]);
printf("\n");
}
return 0;
}
7-97 幂次取余
给定三个正整数A,B和C,求AB mod C的结果,其中mod表示求余数。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入三个正整数A,B,C(A,B,C≤1000000)。
输出格式:
对于每组测试,输出计算后的结果,每组测试的输出占一行。
答案:C
#include<stdio.h>
int main()
{
int n;
long long s = 1, a, b,c;
scanf("%d", &n);
while (n--)
{
scanf("%lld %lld %lld", &a,&b,&c);
a %= c;
while (b > 0)
{
if (b % 2 == 1)
s =(s* a)%c;
b >>= 1;
a = (a * a)%c;
}
printf("%lld\n",s);
s = 1;
}
}