目录
1.回文数
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
示例代码
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int temp;
for (int i = 1; i < 10; i++) {
for (int j = 0; j < 10; j++) {
temp = i * (1000 + 1) + j * (100 + 10);
cout << temp << endl;
}
}
return 0;
}
变量:
temp为遍历到的四位回文数
函数:
主函数中,要输出四位十进制数字,则第一位不能为0,最大为9,第二位可以为0,最大为9,遍历即可,最后把各个位置上的数结合起来
2.特殊回文数
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
输入一行,包含一个正整数n
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54
示例代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000][6];
int b[1000][5];
int c[200];
int main() {
int n,temp,count=0;
cin >> n;
if (n > 45) {
n = n / 2;
for (int i = 1; i < 10; i++) {
for (int j = 0; j < 10; j++) {
temp = n - i - j;
if (temp >= 0 && temp<10) {
a[count][0] = i;
a[count][1] = j;
a[count][2] = temp;
a[count][3] = temp;
a[count][4] = j;
a[count][5] = i;
count++;
}
}
}
for (int i = 0; i < count; i++) {
c[i] = a[i][0] * (100000 + 1) + a[i][1] * (10000 + 10) + a[i][2] * (1000 + 100);
}
sort(c, c + count);
for (int i = 0; i < count; i++) {
cout << c[i] << endl;
}
}
else {
int count1 = 0;
for (int i = 1; i < 10; i++) {
for (int j = 0; j < 10; j++) {
temp = n - 2 * i - 2 * j;
if (temp >= 0 && temp<10) {
b[count][0] = i;
b[count][1] = j;
b[count][2] = temp;
b[count][3] = j;
b[count][4] = i;
count++;
count1++;
}
}
}
for (int i = 0; i < count1; i++) {
c[i] = b[i][0] * (10000 + 1) + b[i][1] * (1000 + 10) + b[i][2] * 100;
}
if (n % 2 == 0) {
n = n / 2;
for (int i = 1; i < 10; i++) {
for (int j = 0; j < 10; j++) {
temp = n - i - j;
if (temp >= 0 && temp<10) {
a[count-count1][0] = i;
a[count-count1][1] = j;
a[count-count1][2] = temp;
a[count-count1][3] = temp;
a[count-count1][4] = j;
a[count-count1][5] = i;
count++;
}
}
}
for (int i = count1; i < count; i++) {
c[i] = a[i-count1][0] * (100000 + 1) + a[i-count1][1] * (10000 + 10) + a[i-count1][2] * (1000 + 100);
}
sort(c, c + count);
for (int i = 0; i < count; i++) {
cout << c[i] << endl;
}
}
else {
for (int i = 0; i < count1; i++) {
cout << c[i] << endl;
}
}
}
return 0;
}
变量:
数组a为储存符合条件的6位十进制回文数的各个位置上的数
数组b为储存符合条件的5位十进制回文数的各个位置上的数
数组c则是将两个数组的数储存起来并按照从小到大进行排序
n为输入的各位数字之和
temp为第三位数字,用来确定是否符合有效组成回文数
count为总共符合的回文数
count1为符合的五位十进制数字的回文数
函数:
主函数中确定输入的n是否大于54,如果大于54,则五位十进制数无法表示(最大为5*9=45),只能有六位十进制数表示
当大于54时,由于第一位数等于第六位数,第二位等于第五位,第三位等于第四位,只需考虑前三位数即可,将n除以2,则是前三位数字的和,如果n是奇数,则没有符合的回文数,第一位不能等于0,第二位处于0-9之间,第三位为n/2-第一位数-第二位数,保证也在0-9区间才行,这样的数符合题目要求,存入c中,最后sort排序输出。
当小于54时,先找五位十进制回文数,五进制数第一位等于第五位,第二位等于第四位,第三位等于n-第一位数*2-第二位数*2,遍历即可,同时count++,count1++,再将符合条件的五进制回文数储存到c中,再找六位十进制回文数,如果n为奇数,则找不到,否则能找到回文数,找回文数和上面大于54一栏方法一样,最后存入数组c中,最后sort排序输出。
3.特殊的数字
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
示例代码
#include<iostream>
using namespace std;
int main() {
int temp,temp1;
for (int i = 1; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
temp = i * 100 + j *10 + k;
temp1 = i * i * i + j * j * j + k * k * k;
if (temp == temp1) {
cout << temp << endl;
}
}
}
}
}
即寻找水仙花数
变量
temp为遍历的三个位上的数结合成的十进制数,temp1为三个位置上的数的立方的相加
函数
主函数中temp==temp1,则符合要求,并将其输出
4.杨辉三角形
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
示例代码
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int a[34][34];
a[0][0] = 1;
a[1][0] = 1;
a[1][1] = 1;
for (int i = 2; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
a[i][j] = 1;
}
else {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
}
杨辉三角形的规律从第三行开始,每行的第一个数字和最后一个数字为1,中间的数字等于上一行对应的列数和上一行对应的列数左边的数之和
变量
数组a是输出的三角形每行每列中的数字
n是输入的行数
函数
主函数中先输入n,再对前两行赋值然后通过遍历得到下面所有行列的数,最后再遍历输出
5.查找整数
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
示例代码
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n,a,b[1000],flag=1;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> b[i];
}
cin >> a;
for (int i = 0; i < n; i++) {
if (b[i] == a) {
cout << i + 1;
flag = 0;
break;
}
}
if (flag == 1) {
cout << -1;
}
}
变量
n为要输入的数字数目
a为要寻找的数字
数组b为要输入的若干数字
flag判断是否找到符合的数,找到的话置为0
函数
主函数中先输入数据,再开始遍历,找到第一个符合的数字就将其在数组的位置输出并flag置为0,跳出循环,如果最后没找到,那么flag还是1,则输出-1