杭电oj练习题汇总2021-10-28

杭电oj练习题汇总

1001:
Problem Description
若一个数的三次方的后两位是11,那么将其称之为“单身数”,现知道第一个“单身数”是71,你能算出第n个“单身数”是多少吗?
Input
输入一个正整数T(T<=100),表示有T组数据,每组数据包括一个整数n(1<=n<=1000000)
Output
输出第n个“单身数”。
代码如下(示例):

#include <stdio.h>
int main(){
	int T,n; 
	scanf("%d",&T);
	while(T--){  
	    scanf("%d",&n); 
	    n=(n-1)*100+71;
		printf("%d\n",n);
	}
	return 0;
}

结果:

1 1
71

1002:
Problem Description
给出在[0, 100]范围内的整数数字,你能把对应的中文写出来吗?
Input
第一行输入一个T (T <= 20),后面每行一个数字,题目保证数字是[0, 100]。
Output
第一行输入一个T (T <= 20),后面每行一个数字,题目保证数字是[0, 100]。
代码如下(示例):

#include <stdio.h>//方法一
int main(){
	int T;
while(T!=0){
	scanf("%d",&T);
if(T<=10){
	switch(T%100){
		case 0:printf("零\n");break;
		case 1:printf("一\n");break;
		case 2:printf("二\n");break;
		case 3:printf("三\n");break;
		case 4:printf("四\n");break;
		case 5:printf("五\n");break;
		case 6:printf("六\n");break; 
		case 7:printf("七\n");break;
		case 8:printf("八\n");break;
		case 9:printf("九\n");break;
		case 10:printf("十\n");break;
	  }
	}
else if(T>10||T<100){
	switch(T/10){
					case 1:printf("十");break;
					case 2:printf("二十");break;
					case 3:printf("三十");break;
					case 4:printf("四十");break;
					case 5:printf("五十");break;
					case 6:printf("六十");break; 
					case 7:printf("七十");break;
					case 8:printf("八十");break;
					case 9:printf("九十");break;
					case 10:printf("一百");break;
		  }
	switch(T%10){
				case 1:printf("一\n");break;
				case 2:printf("二\n");break;
				case 3:printf("三\n");break;
				case 4:printf("四\n");break;
				case 5:printf("五\n");break;
				case 6:printf("六\n");break; 
				case 7:printf("七\n");break;
				case 8:printf("八\n");break;
				case 9:printf("九\n");break;
				case 10:printf("十\n");break;
	  }
	
	}
} 
scanf("%d",&T);
return 0;
}
#include<iostream>//方法二
using namespace std;
string arr[10] = { "零","一","二","三","四","五","六","七","八","九"};
void sum(int x) {
	if (x < 10)
	{
		cout << arr[x];
	}
	else if (x == 10) {
		cout << "十";
	}
	else if (x == 100) {
		cout << "一百";
	}
	else {
		int y = x / 10;
		cout << arr[y] << "十";
		int z = x - y * 10;
		if (z > 0)
			cout << arr[z];
	}
	cout << endl;
	
}
int main() {
	
		int x;
		while(x){
			cin >> x;
		    sum(x);
		}
			cin >> x;
		 
	return 0;
}

结果:

100
一百
70
七十
88
八十八
8

1003:
Problem Description
某个实验需要统计时间,记录了实验开始和结束的时间,计算实验所用的时间。
Input
第一行输入一个整数n,表示样例个数,0<n<1000。接下来每组样例两行,表示开始时间和结束时间,格式为x天HH时MM分SS秒,x是一个整数表示第几天,0<x<20000,保证时间合法,结束时间比开始时间晚。
代码如下(示例):

#include <stdio.h>
int main(){
	int n;
	int X1,H1,M1,S1; 
	int X2,H2,M2,S2; 
	int X,H,M,S;
	int max;
	scanf("%d",&n);
	while(n--){
	scanf("%d天%d小时%d分%d秒",&X1,&H1,&M1,&S1);
	scanf("%d天%d小时%d分%d秒",&X2,&H2,&M2,&S2);
	max=X2*(24*60*60)+H2*(60*60)+M2*(60)+S2-(X1*(24*60*60)+H1*(60*60)+M1*(60)+S1);
	X=max/(24*60*60);
	H=max/(60*60)%24;
	M=max/60%60;
	S=max%60;
	printf("%02d天%02d小时%02d分%02d秒",X,H,M,S);
	}
	return 0;
} 

结果:

1
0123小时24090123小时25110000小时0102

1004:(待解答!)
Problem Description
已知an=2*an-1+n2,a0=0。输入n,计算an的值。
Input
输入数据有多组,每组数据包含一个整数n<=1018(10的18次方)。
Output
一个整数an,表示递推式第n项的值。因数字太大,结果对于1000000009取模后输出。
代码如下(示例):

#include<stdio.h>
#define mod 1000000009
long long fun(long long x,long long y)
{
    long long a=x,c=1;
    while(y)
    {
        if(y%2==1)
            c=(c*a)%mod;
        y/=2;
        a=(a*a)%mod;
      }
    return c;
}

int main()
{
    long long n,k,t,g;
   
    while( scanf("%lld",&n)!=EOF)
    {
        if(n==0)
            printf("an=0\n");
        else
        {
            t=n%mod;//取模就是取余 
            k=(t*t)%mod;
            g=(6*fun(2,n)-k-4*t-6)%mod;
            if(g<0)
                g+=mod;
            printf("an=%lld\n",g);
        }
    }
    return 0;
}

结果:

0
an=0
1
an=1
2
an=6
3
an=21

1005:
Problem Description
已知一个数列,它的循环周期为30,且前30项的值分别为0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1。现在给定该数列的前两项,你能计算得到第三项的值吗?
Input
第一行数据组数T(T <= 30),对于每组数据两个整数a, b(0<= a, b<=15),表示前两项的大小。
Output
每组数据占一行,表示第三项的值。
代码如下(示例):

#include <stdio.h>
int main(){
	int T;
	int a,b; 
	int arr[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
	14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
	scanf("%d",&T);
	while(T--){
		scanf("%d %d",&a,&b);
		for(int i=0;;++i){
		if(arr[i]==a&&arr[i+1]==b){
		printf("%d\n",arr[i+2]);
		break;
		 }
		}
	}
	return 0;
}

结果:

2
11 10
9

1006:
Problem Description
小华有两个长度不超过1000的字符串s和t,现在他想将两个字符串翻转后拼接在一起(将s和t分别翻转后,按照s在前t在后的顺序拼接),但是小华现在很忙,你能帮他完成吗?
Input
输入有多组数据,每组数据两行,第一行为字符串s,第二行为字符串t。
Output
将s和t分别翻转后拼接在一起输出。
代码如下(示例):

#include <stdio.h>//网页上调试未AC
#include <string.h>
void print(char *str){
	int i;
	int n=strlen(str);
	char temp;
	for(i=0;i<n/2;i++){
		temp=str[i];
		str[i]=str[n-i-1];
		str[n-i-1]=temp;
	}
}
int main(){
	char s[1000];
	char t[1000];
	gets(s);
	print(s);
	gets(t);
	print(t);
	strcat(s,t);
	printf("%s",s);
	return 0;
}
#include <stdio.h>//通过
#include <string.h>
int main(){
	char s[1000];
	char t[1000];
	while(1){
	if(scanf("%s",s)!=1||scanf("%s",t)!=1) break;
	for(int i=strlen(s)-1;i>=0;--i)
	putchar(s[i]);
	for(int i=strlen(t)-1;i>=0;--i)
	putchar(t[i]);
	}
		return 0;
} 

结果:

abcd
hsg
dcbagsh

总结

部分算法未掌握,记得回顾。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值