目录
7-84 求整数序列中出现次数最多的数
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入格式:
输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。
输出格式:
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。
输入样例:
10 3 2 -1 5 3 4 3 0 3 2
输出样例:
3 4
// 方法一
// 使用嵌套for循环,找到出现次数最多的数字
#include <stdio.h>
int a[1009];
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int max=0,ans=a[0];
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<n;j++){
if(a[i]==a[j]) cnt++;
}
if(cnt>max){
ans=a[i];
max=cnt;
}
}
printf("%d %d",ans,max);
return 0;
}
// 方法二
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;cin >> n;
map<int,int> mp;
vector<int> v(n); // 存数字
for(int i=0;i<n;i++){
cin >> v[i];
mp[v[i]]++;
}
int num=v[0];
int cnt=mp[v[0]];
for(auto it=mp.begin();it != mp.end();it++){
if(it->second > cnt){
num=it->first;
cnt=it->second;
}
}
cout << num << ' ' << cnt ;
return 0;
}
7-85 统计字符出现次数
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例:
2
#include <stdio.h>
int main(){
char s[89],ch;
gets(s);
scanf("%c",&ch);
int cnt=0,ans=0;
while(s[cnt]!='\0'){
if(s[cnt]==ch) ans++;
cnt++;
}
printf("%d",ans);
return 0;
}
7-86 古风排版
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_LENGTH 1001
// 每列N个相当于N行,有ceil(len/n)列,我们将输出样例逆时针旋转90°
// 此时的N行变成了N列,ceil(len/n)行
void printAncientStyle(int N, const char *str) {
int length = strlen(str);
int rows = ceil(length*1.0 / N); // 计算总行数(列数)
char matrix[MAX_LENGTH][N + 1]; // 处理每行的字符矩阵
// 填充矩阵
for (int i = 0; i < rows; i++) {
strncpy(matrix[i], str + i * N, N);
matrix[i][N] = '\0'; // 确保每行字符串的末尾为 '\0'
}
// 打印古风排版
for (int col = 0; col < N; col++) {
for (int row = rows - 1; row >= 0; row--) {
if (matrix[row][col] != '\0') // 仅打印有效字符
printf("%c", matrix[row][col]);
else
printf(" "); // 打印空格以对齐
}
printf("\n");
}
}
int main(void) {
int N;
char str[MAX_LENGTH];
scanf("%d\n", &N); // 读取列数
// fgets(str, sizeof(str), stdin); // 读取字符串(包括空格)
// // 去掉可能的换行符
// str[strcspn(str, "\n")] = '\0';
gets(str);
printAncientStyle(N, str);
return 0;
}
7-87 散步
小土豆在公园按一定的规律散步。为确定自己的位置,小土豆在地图上画出了坐标系,并规定自己的初始位置是 (x,y)=(0,0)点,向东 x 指标增加,向北 y 坐标增加,1米为1单位程度。
一开始小土豆面朝东方,第i个阶段会向前走t米,并向左转。请帮小土豆计算经过n个阶段小土豆在哪
输入格式:
一行一个整数 n,代表小土豆行动的阶段数。
输出格式:
一行两个整数,代表小土豆最终位置的 x 坐标和 y坐标。
输入样例:
100
输出样例:
-50 -50
// 运行超时
#include <stdio.h>
// 右->上->左->下
int main(){
long long int x=0,y=0;
long long int n;scanf("%lld",&n);
for(int i=1;i<=n;i++){
if(i%4==1) x+=i; // 右
else if(i%4==2) y+=i; // 上
else if(i%4==3) x-=i;// 左
else if(i%4==0) y-=i; // 下
}
printf("%lld %lld",x,y);
return 0;
}
// 优化
#include<stdio.h>
int main() {
long long int n;
scanf("%lld", &n);
long long int x = 0, y = 0;
if (n >= 4) {
// 计算完整的四个方向的圈数
long long int full_cycles = n / 4;
// 每个完整圈的移动(画图)- 等同于 n%4==0
x -= 2 * full_cycles; // 左
y -= 2 * full_cycles; // 下
// 处理剩余的步数
int remainder = n % 4; //
if (remainder >= 1) x += 4 * full_cycles + 1; // 右
if (remainder >= 2) y += 4 * full_cycles + 2; // 上
if (remainder >= 3) x -= 4 * full_cycles + 3; // 左
// if (remainder >= 4) y -= 4 * full_cycles + 4; // 下
}
else {
// 处理小于4步的情况
for (int i = 1; i < n; i++) {
if (i == 1) x += i; // 右
if (i == 2) y += i; // 上
if (i == 3) x -= i; // 左
}
}
printf("%lld %lld\n", x, y);
return 0;
}
7-88 小鱼的航程
有一只小鱼,它上午游泳 150 公里,下午游泳 100 公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7) 开始算起,请问这样过了 n 天以后,小鱼一共累计游泳了多少公里呢?
输入格式:
输入两个整数 x , n (表示从周 x 算起,经过 n 天,x 是 1~7之间的整数,$$ 是 0~1000 之间的整数)。
输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。
输入样例:
在这里给出一组输入。例如:
3 10
输出样例:
在这里给出相应的输出。例如:
2000
#include <stdio.h>
int main(){
int x,n;scanf("%d %d",&x,&n);
int ans=0;
for(int i=0;i<n;i++){
if(x!=6 && x!=7) ans+=250;
if(x==7) x=0;
x++;
}
printf("%d",ans);
return 0;
}
7-89 成绩进步
小 Y 立志于做一个不偏科、所有学科全面发展的学生,然而,他的英语成绩始终未能达到他的预期。因此,他下定决心要提升自己的英语水平。
为了达成这个目标,他精心制定了一系列英语学习计划:清晨,他专注于背诵英语单词;中午,他倾听英语广播以锻炼听力;晚上,他则通过阅读英文报纸来拓宽阅读视野。不仅如此,他还决定每周进行一次英语水平测试,以此检验自己的学习成果。
作为小 Y 的好朋友,你每次都耐心地为他批改英语水平测试试卷,并将试卷妥善保存。经过 n 次测试后,小 Y 对自己的进步充满了好奇,他想知道自己的测试成绩是否呈现出持续且严格的进步态势——即除了第一次测试外,每一次的成绩都严格高于前一次。因此,他恳请你回顾他的所有测试成绩,并给出确切的答案。
输入格式:
输入共两行,
第一行一个整数 n(<=10),表示测试次数。
第二行 n 个整数,第 i 个数 a[i](<=100)表示第 i 次测试的成绩。
输出格式:
一行,如果是严格进步的,输出”YES”,否则输出”NO”。
输入样例1:
3
100 100 100
输出样例1:
NO
输入样例2:
3
99 98 95
输出样例2:
NO
输入样例3:
4
63 79 89 99
输出样例3:
YES
# include <stdio.h>
int a[11];
int main(){
int n;scanf("%d",&n);
int cnt=0;
while(n--){
int s;scanf("%d",&s);
a[cnt++]=s;
}
int flag=1;
for(int i=1;i<cnt;i++) {
if(a[i]<=a[i-1]) {
flag=0;
break;
}
}
if(flag) printf("YES");
else printf("NO");
return 0;
}
7-90 计算长方形的周长和面积
输入长方形的长和宽,要求计算长方形的周长和面积。
输入格式:
在一行中给出两个整数。
输出格式:
第一行长方形的周长。
第二行长方形的面积。
输入样例:
在这里给出一组输入。例如:
6 8
输出样例:
在这里给出相应的输出。例如:
周长 = 28
面积 = 48
#include <stdio.h>
// 考虑数据类型的范围
int main(){
long long x,y;
long long c,s;scanf("%lld %lld",&x,&y);
c=(x+y)*2;
s=x*y;
printf("周长 = %lld\n",c);
printf("面积 = %lld",s);
return 0;
}
7-91 求一元二次方程的根
利用公式x1 = (-b + sqrt(bb-4ac))/(2a), x2 = (-b - sqrt(bb-4ac))/(2a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。
输入格式:
输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数。
输出格式:
输出一行,表示方程的解。
若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=…。
若b2 > 4 * a * c,则两个实根不等,则输出形式为:x1=…;x2 = …,其中x1>x2。
若b2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2a), 虚部 = sqrt(4ac-bb) / (2*a)
所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
输入样例1:
1 0 1
输出样例1:
x1=0.00000+1.00000i;x2=0.00000-1.00000i
输入样例2:
1.0 2.0 8.0
输出样2:
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c;scanf("%lf %lf %lf",&a,&b,&c);
double delt=b*b-4*a*c;
if(delt==0) {
printf("x1=x2=%.5f;",-b/(2*a));
}
else if (delt>0) {
printf("x1=%.5f;",(-b+sqrt(delt))/(2*a));
printf("x2=%.5f",(-b-sqrt(delt))/(2*a));
}
else { // delt < 0
double r,i;
r=-b/(2*a);
i=sqrt(-delt)/(2*a);
printf("x1=%.5f+%.5fi;",r,i);
printf("x2=%.5f-%.5fi",r,i);
}
return 0;
}
7-92 找相同字符
给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。
两个方案不同当且仅当这两个子串中有一个位置不同。
输入格式:
两行,两个字符串 s1,s2,长度分别为 n1,n2。
输出格式:
1≤n1,n2≤2×10^3,
字符串中只有小写字母。
输入样例:
aabb
bbaa
输出样例:
10
#include <stdio.h>
#include <string.h>
#define MAXN 2005
int dp[MAXN][MAXN];
int main() {
char s1[MAXN], s2[MAXN];
scanf("%s", s1);
scanf("%s", s2);
int n1 = strlen(s1);
int n2 = strlen(s2);
// 初始化dp数组
// for (int i = 0; i <= n1; ++i) {
// for (int j = 0; j <= n2; ++j) {
// dp[i][j] = 0;
// }
// }
memset(dp,0,sizeof(dp));
// 计算dp值
long long ans = 0; // 使用 long long 来防止整数溢出
for (int i = 1; i <= n1; ++i) {
for (int j = 1; j <= n2; ++j) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
ans += dp[i][j];
}
}
printf("%lld\n", ans);
return 0;
}
7-93 连续整数相加
读入两个整数值 A 和 N,计算从 A 开始的 N 个连续整数的和。
注意,如果读入的 N 为 0 或负数,则继续读取数字直至读入 N 值为正整数为止。
输入格式:
共一行,包含整数 A 和若干个整数 N(不超过 100 个)。
输出格式:
一个整数,表示从 A 开始的 N 个连续整数的和。
数据范围
1≤A≤100,
−100≤N≤100
输入样例1:
3 2
输出样例1:
7
输入样例2:
3 -1 0 -2 2
输出样例2:
7
#include <stdio.h>
int main(){
int a,n;scanf("%d",&a);
// 如果n的值小于或等于0,那么继续读取下一个值。重复上述过程直到读取到一个大于0的值为止。
while(scanf("%d",&n) && n<=0);
int sum=0;
while(n--){
sum+=a++;
}
printf("%d",sum);
return 0;
}
7-94 数组逆序
给你 n 个整数,将其逆序输出。
输入格式:
第一行一个整数 n (3<=n<=10) 代表数的个数。
第二行 n 个整数(空格隔开)(这些数在 0~10^6 之间)。
输出格式:
n 个整数(空格隔开)。
输入样例:
在这里给出一组输入。例如:
3
1 7 5
输出样例:
在这里给出相应的输出。例如:
5 7 1
#include <stdio.h>
int a[11];
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=n-1;i>=0;i--){
if(i==0) printf("%d",a[i]);
else printf("%d ",a[i]);
}
return 0;
}
7-95 第n小的质数
输入一个正整数n,求第n小的质数。
输入格式:
一个不超过10000的正整数n。
输出格式:
第n小的质数。
数据范围
对于20%的数据 n<=500
对于50%的数据 n<=800
对于60%的数据 n<=1000
对于80%的数据 n<=5000
对于100%的数据 n<=10000
输入样例:
10
输出样例:
29
# include <stdio.h>
int isPrime(int x){
if(x<=3) return 1;
if(x%2==0 || x%3==0) return 0;
for(int i=4;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
int arr[1000000]; // 素数数组要足够大, 对于100%的数据 n<=10000
int main(){
int n;scanf("%d",&n);
int cnt=0;
for(int i=2;i<=1000000;i++){
if(isPrime(i)) arr[cnt++]=i;
}
// for(int i=0;i<cnt;i++) printf("%d ",arr[i]);
printf("%d",arr[n-1]);
return 0;
}
7-96 连续非素数的最大长度
给出一个正整数 n ( 2<=n<=1000000 ),例如 n=30 ,在 1,2,3,……30 中,连续的非素数有:
4 长度为 1
6 长度为 1
8 9 10 长度为 3
12 长度为 1
14 15 16 长度为 3
18 长度为 1
20 21 22 长度为 3
24 25 26 27 28 长度为5
30 长度为 1
其中,最大长度为 5 ,即有连续的 5 个非素数。
输入格式:
一个整数 n 。
输出格式:
一个整数,即连续非素数最大长度。
数据范围
对于20%的数据 n<=100
对于30%的数据 n<=1000
对于50%的数据 n<=50000
对于60%的数据 n<=100000
对于80%的数据 n<=300000
对于100%的数据 n<=1000000
输入样例:
12
输出样例:
3
// 方法一
# include <stdio.h>
int isPrime(int x){
if(x==1) return 0;
for(int i=2;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
int arr[100000]; // 素数数组
int main(){
int n;scanf("%d",&n);
int cnt=0;
for(int i=2;i<=n;i++){
// if(isPrime(i)) arr[++cnt]=i;
if(isPrime(i)) arr[cnt++]=i;
}
// for(int i=0;i<cnt;i++) printf("%d ",arr[i]);
// // 后者-1再减去前者
int max=0,len=0;
// for(int i=1;i<=cnt;i++){
for(int i=0;i<cnt;i++){
len=arr[i]-1-arr[i-1];
if(len>max) max=len;
}
printf("%d",max);
return 0;
}
// 思路,计算2-n间的所有素数,然后用right-1-left,得到两素数间非素数的长度;
// 方法二
#include <stdio.h>
// 判断素数函数
int isPrime(int x) {
if (x == 1) return 0; // 1不是素数
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return 0; // 如果能被整除,不是素数
}
return 1; // 是素数
}
int main() {
int n;
scanf("%d", &n);
int max_len = 0, cur_len = 0;
for (int i = 1; i <= n; i++) {
if (!isPrime(i)) {
cur_len++;
} else {
if (cur_len > max_len) {
max_len = cur_len; // 更新最大长度
}
cur_len = 0; // 重置当前连续非素数的长度
}
}
printf("%d\n", max_len);
return 0;
}
7-97 螺旋加密
Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:
- 所有文本只包含大写字母和空格。
- 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。
按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:
将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被
加密为:0000110100101100。
输入
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
输入格式:
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出格式:
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
数据范围
对于30%的数据 R,C<=10
对于100%的数据 R,C<=20
输入样例:
在这里给出一组输入。例如:
4 4 ACM
输出样例:
在这里给出相应的输出。例如:
0000110100101100
#include<bits/stdc++.h> // 包含所有标准库的头文件,一般不推荐使用在实际的C++编程中,应当使用具体需要的头文件。
using namespace std; // 使用标准命名空间
int r, c, b[500], m[30][30], num, k=1, r1, r2, c1, c2; // 定义变量和数组
char a[100]; // 定义字符数组
int main() {
cin >> r >> c; // 输入行数和列数
getchar(); // 读取换行符
cin.getline(a, 100); // 读取一行字符串
int len = strlen(a); // 获取字符串长度
for (int i = 0; i < len; i++) {
if (a[i] == ' ') {
num = 0; // 如果是空格,将num置为0
// printf("%c\n",a[i]);
} else {
num = a[i] - 'A' + 1; // 将字母转换成对应的数字,A对应1,B对应2,依次类推
// printf("%c\n",a[i]);
}
for (int j = 1; j <= 5; j++) {
b[(i + 1) * 5 + 1 - j] = num % 2; // 将数字转换为5位二进制存入数组b
// printf("%d\n",num%2);
num /= 2;
}
}
// b[r*c]=0; // 注意你可能需要用0将矩阵补充完整。 b数组在静态区创建,默认全0
// for(int i=1;i<=r*c;i++) printf("%d",b[i]);
// printf("\n");
r1 = 0; r2 = r - 1; c1 = 0; c2 = c - 1; // 初始化矩阵边界
// 将数组b 螺旋填充矩阵
while (r1 <= r2 && c1 <= c2) {
for (int j = c1; j <= c2; j++) m[r1][j] = b[k++]; // 从左到右填充上边界
for (int i = r1 + 1; i <= r2; i++) m[i][c2] = b[k++]; // 从上到下填充右边界
if (r1 != r2) for (int j = c2 - 1; j >= c1 ; j--) m[r2][j] = b[k++]; // 如果不是同一行,从右到左填充下边界
if (c1 != c2) for (int i = r2 - 1; i >= r1 + 1; i--) m[i][c1] = b[k++]; // 如果不是同一列,从下到上填充左边界
r1++; r2--; c1++; c2--; // 缩小边界
}
// 输出填充好的矩阵
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << m[i][j] ; // 输出矩阵中的每一个元素
}
// cout << endl;
}
return 0; // 返回0,表示程序正常运行结束
}
7-98 小X数字母
小 X 喜欢研究字符串。
这天,小 X 随手在草稿纸上写下了一个大写字母字符串。此时,班长把成绩报告单发到了每位同学的手中。小 X 看到自己每门都是 A (优秀),非常高兴,灵光一闪想到一个问题: 在刚刚写下的字符串中,字母 A 最多连续出现了多少次呢?
小 X 立刻数了起来,但这个字符串实在是太长了,希望你帮帮他。
输入格式:
第一行一个字符串。(长度<=30)
输出格式:
第一行包含一个整数,表示该字符串中字母 A 最多连续出现的次数。
输入样例:
BAACA
输出样例:
2
#include <stdio.h>
int main(){
char ch[39];
scanf("%s",ch);
int flag=0;
// 1.整个字符串不存在A
for(int i=0;ch[i]!='\0';i++){ // 遍历字符串
if(ch[i]=='A') flag=1;
}
if(flag==0) {
printf("%d",0);
return 0;
}
// 寻找A连续出现的次数。
int len=1,max=0;
for(int i=0;ch[i]!='\0';i++){ // 遍历字符串
if(ch[i]=='A'){
if(ch[i+1]=='A') len+=1;
else {
if(len>max) max=len;
len=1;
}
}
}
printf("%d",max);
return 0;
}
7-99 质数
一个大于 1 的自然数,如果除了 1 和它自身外,不能被其他自然数整除则称该数为质数。
例如 7 就是一个质数,因为它只能被 1 和 7 整除。
现在,给定你 N 个大于 1 的自然数,请你依次判断这些数是否是质数。
输入格式:
第一行包含整数 N,表示共有 N 个测试数据。
接下来 N 行,每行包含一个自然数 X。
输出格式:
每个测试用例输出一个结果,每个结果占一行。
如果测试数据是质数,则输出 X is prime,其中 X 是测试数据。
如果测试数据不是质数,则输出 X is not prime,其中 X 是测试数据。
数据范围
1≤N≤100,
1<X≤10^18
输入样例:
3
8
51
7
输出样例:
8 is not prime
51 is not prime
7 is prime
#include <stdio.h>
// 数据类型
// 2 3 5 7 9 11 13
int isPrime(long long int x){
if(x<=1) return 0;
// if(x<=3) return 1;
// if(x%2==0 || x%3==0) return 0;
for(long long int i=5;i*i<=x;i++){
if(x%i==0) return 0;
}
return 1;
}
int main(){
int n;scanf("%d",&n);
while(n--){
long long int x;scanf("%lld",&x);
if(isPrime(x))
printf("%lld is prime\n",x);
else
printf("%lld is not prime\n",x);
}
return 0;
}
7-100 打印星号三角形
打印星号三角形。
输入格式:
输入只有一行,包括 1 个整数 n(<=50) , n 代表行数
输出格式:
输出 n 行。
输入样例:
5
输出样例:
* * *
*** *** ***
***** ***** *****
******* ******* *******
***************************
#include <stdio.h>
int main(){
int n;scanf("%d",&n);
int cnt=0,start=1;
for(int i=0;i<n;i++) {// 遍历行
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
// 打印 *
cnt=start;
while(cnt--) printf("*");
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
// 打印 *
cnt=start;
while(cnt--) printf("*");
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
// 打印 *
cnt=start;
while(cnt--) printf("*");
// 打印空格
for(int j=0;j<n-1-i;j++) printf(" ");
start+=2;
printf("\n");
}
return 0;
}
7-101 简单函数
定义函数为:f(x)=x*2+1
要求编写程序,完成函数
输入格式:
一个数x
输出格式:
函数的值
输入样例:
4
输出样例:
9
#include <stdio.h>
int main(){
long long int x; // 数据范围足够大!!!
scanf("%lld",&x);
long long int ans=x*2+1;
printf("%lld",ans);
return 0;
}
7-102 等差数列末项计算
给出一个等差数列的前两项a1,a2,求第n项是多少。
输入格式:
给出一个等差数列的前两项a1,a2,求第n项是多少。
输出格式:
一行,包含三个整数a1,a2,n。
输入样例:
1 4 100
输出样例:
298
#include <stdio.h>
int main(){
int a1,a2,n;scanf("%d %d %d",&a1,&a2,&n);
int step=a2-a1;
long long int ans=a1; // ans的范围要足够大!!!
n-=1;
while(n--){
ans+=step;
}
printf("%lld",ans);
return 0;
}
7-103 数独
已知下列44阶数独,要求将1,2,3,4这四个数填入空格,并使每行,每列和每宫都包含这四个数。
输入格式:
无
输出格式:
输出44完整数独
输入样例:
无
输出样例:
2413
3124
1342
4231
# include <stdio.h>
int main(){
int ans[4][4]={{2,4,1,3},
{3,1,2,4},
{1,3,4,2},
{4,2,3,1}};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++) printf("%d",ans[i][j]);
printf("\n");
}
return 0;
}
7-104 神奇的幻方
幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入格式:
一个数字N(N<=35)
输出格式:
按上方法构造的N * N的幻方
输入样例:
3
输出样例:
8 1 6
3 5 7
4 9 2
解题思路:
第一个数字写在第一行的中间,
下一个数字,都写在上一个数字的右上方:
如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列;
如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行;
如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
在题目描述的基础上进行推倒,并时刻对row和col保持边界感,[0,n)之间
# include <stdio.h>
int ans[40][40];
int main()
{
int n;scanf("%d",&n);
ans[0][n/2]=1; // 第一个数字
int row=0,col=n/2; // 所在位置
for(int i=2;i<=n*n;i++){
if(row==0 && ans[n-1][col+1]==0 && (col+1<n)){ // 在第一行
row=n-1,col+=1;
ans[row][col]=i;
// printf(" %d\n",i);
// printf("%d %d\n",row,col);
}
else if(col==n-1 && ans[row-1][0]==0 && row-1>=0){ // 在最后一列
row-=1,col=0;
ans[row][col]=i;
// printf(" %d\n",i);
// printf("%d %d\n",row,col);
}
else if((row==0 && col==n-1) || (ans[row-1][col+1]!=0 && row + 1>=0 && col+1<n)){ // 右上角或右上方有数字
row+=1;
ans[row][col]=i;
// printf(" %d\n",i);
// printf("%d %d\n",row,col);
}
else if(ans[row-1][col+1]==0 && row-1>=0 && col+1<n){ // 右上方没有数字
row-=1,col+=1;
ans[row][col]=i;
// printf(" %d\n",i);
// printf("%d %d\n",row,col);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) {
if(j==n-1) printf("%d",ans[i][j]);
else printf("%d ",ans[i][j]);
}
printf("\n");
}
return 0;
}