试题 算法训练 反置数
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述:
一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,1245的反置数是5421,而1200的反置数是21。请编写一个程序,输入两个整数,然后计算这两个整数的反置数之和sum,然后再把sum的反置数打印出来。要求:由于在本题中需要多次去计算一个整数的反置数,因此必须把这部分代码抽象为一个函数的形式。
输入格式:输入只有一行,包括两个整数,中间用空格隔开。
输出格式:输出只有一行,即相应的结果。
输入输出样例:
样例输入:
435 754
样例输出:
199
注意:
这个小题出现了字符串与整形数转换的函数。
头文件include"cstdlib"
atoi:int a=atoi(char*c) 把字符串换成整形数
itoa: itoa(a,b,m) a表示要转化成字符串的数,b表示收集数据的数组指针,m表示的是进制。
code:
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
char a[100], b[100],c[100],d[100],f[100],l[100];
long long h, g;
cin >> a >> b;
int i,n,m,k;
n = strlen(a);
m = strlen(b);
for (i = n - 1; i >= 0; i--)
c[n-i-1] = a[i];
for (i = n - 1; i >= 0; i--)
d[n - i - 1] = b[i];
h = atoi(c);
g = atoi(d);
int sum = h + g,sum2;
itoa(sum, f, 10);
k = strlen(f);
for (i = k - 1; i >= 0; i--)
l[k - i - 1] = f[i];
sum2 = atoi(l);
cout <<sum2<< endl;
return 0;
}
试题 算法训练 乘法表
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
输出九九乘法表。
输出格式
输出格式见下面的样例。乘号用“”表示。
样例输出
下面给出输出的前几行:
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 4*4=16
……
没得说,太简单,直接上代码:
#include<iostream>
using namespace std;
int main()
{
int i,j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
cout << i<<"*"<<j << "=" << i*j<<" ";
}
cout << endl;
}
return 0;
}
试题 算法训练 寂寞的数
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
道德经曰:一生二,二生三,三生万物。
对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。
因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))…例如,从33开始的递增序列为:
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, …
我们把n叫做d(n)的生成元,在上面的数列中,33是39的生成元,39是51的生成元,等等。有一些数字甚至可以有两个生成元,比如101,可以由91和100生成。但也有一些数字没有任何生成元,如42。我们把这样的数字称为寂寞的数字。
输入格式
一行,一个正整数n。
输出格式
按照升序输出小于n的所有寂寞的数字,每行一个。
样例输入
40
样例输出
1
3
5
7
9
20
31
数据规模和约定
n<=10000
code:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n,k,sum,i,a[100000];
cin >> n;
memset(a, 0, sizeof(a));
for (i = 1; i <= n; i++)
{
k = i;
sum = k;
while(k)
{
sum += k % 10;
k /= 10;
}
a[sum] = 1;//标记
}
for (i = 1; i <= n; i++)
if (a[i]==0)
cout << i << endl;
return 0;
}
试题 算法训练 6-1 递归求二项式系数值
资源限制
时间限制:10.0s 内存限制:256.0MB
问题描述
样例输入
一个满足题目要求的输入范例。
3 10
样例输出
与上面的样例输入对应的输出。
数据规模和约定
输入数据中每一个数的范围。
例:结果在int表示时不会溢出。
超简单递归,没的说:
#include<stdio.h>
int sx(int x, int y)
{
if (y == 0 || y == x)
return 1;
return sx(x - 1, y) + sx(x - 1, y - 1);
}
int main()
{
int n, k,sum;
scanf("%d%d",&k,&n);
sum=sx(n, k);
printf("%d",sum);
return 0;
}
试题 算法训练 学做菜
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
涛涛立志要做新好青年,他最近在学做菜。由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上字母A,B,C,D。
涛涛现在会做的菜有五种:
1、 西红柿炒鸡蛋 原料:AABDD
2、 酸辣鸡丁 原料:ABCD
3、 宫保鸡丁 原料:CCD
4、 水煮西红柿 原料:BBB
5、 怪味蛋 原料:AD
这天早上,开开去早市给涛涛买了一些原料回来。由于事先没有什么计划,涛涛决定,对于现存的原料,每次尽量做菜单上靠前(即编号小)的菜。
现在请你写一个程序,判断一下开开和涛涛中午能吃到哪些菜。
输入格式
共4个整数a,b,c,d。分别表示开开买的A,B,C,D这4种原料的数量。每种原料不会超过30份。
输出格式
输出5行。其中第i行表示涛涛做的第i种菜的数目。
样例输入
3
1
2
4
样例输出
1
0
1
0
1
我的解法是最暴力的,如果有哪位大哥知道简单一点的解法请务必留言,拜托了!
code:
#include<stdio.h>
void one(int a[])
{
int i = 0;
while (a[0] >= 2 && a[1] >= 1 && a[3] >= 2)
{
i++;
a[0] -= 2;
a[1] -= 1;
a[3] -= 2;
}
printf("%d\n", i);
}
void two(int a[])
{
int i = 0;
while (a[0] >= 1 && a[1] >= 1 && a[2] >= 1 && a[3] >= 1)
{
i++;
a[0] -= 1;
a[1] -= 1;
a[2] -= 1;
a[3] -= 1;
}
printf("%d\n", i);
}
void three(int a[])
{
int i = 0;
while (a[2] >= 2 && a[3] >= 1)
{
i++;
a[2] -= 2;
a[3] -= 1;
}
printf("%d\n", i);
}
void four(int a[])
{
int i = 0;
while (a[1] >= 3)
{
i++;
a[1] -= 3;
}
printf("%d\n", i);
}
void five(int a[])
{
int i = 0;
while (a[0] >= 1 && a[3] >= 1)
{
i++;
a[0] -= 1;
a[3] -= 1;
}
printf("%d\n", i);
}
int main()
{
int a[4];
int i;
for (i = 0; i<4; i++)
scanf("%d", &a[i]);
one(a);
two(a);
three(a);
four(a);
five(a);
return 0;
}