金币
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1N+1N+1天里,每天收到N+1N+1N+1枚金币。
请计算在前KKK天里,骑士一共获得了多少金币。
输入输出格式
输入格式:
一个正整数KKK,表示发放金币的天数。
输出格式:
一个正整数,即骑士收到的金币数。
输入样例:
6
输出样例:
14
自己的理解:
#include<stdio.h>
int main()
{
int n; //表示第几天
scanf("%d",&n);
int add=1;
int ans=0;
while(n>0) \\判断天数大于0天
{
if(n>=add) \\判断剩余天数是否大于连续的天数
{
n-=add; //将剩余天数减去连续的天数
ans+=add*add; \\将连续天数的金钱加起来
}
else
{
ans+=add*n; n-=add; //将不足与连续天数的金钱加起来
}
add++; //连续的天数自增
}
printf("%d",ans);
return 0;
}
神奇的幻方
题目描述
幻方是一种很神奇的 N∗NN∗N 矩阵:它由数字 1,2,3,⋯⋯,N×N1,2,3,⋯⋯,N×N 构成,且每行、每列及两条对角线上的数字之和都相同。
当 NN 为奇数时,我们可以通过下方法构建一个幻方:
首先将 11 写在第一行的中间。
之后,按如下方式从小到大依次填写每个数 K(K=2,3,⋯,N×N)K(K=2,3,⋯,N×N) :
1.若 (K−1)(K−1) 在第一行但不在最后一列,则将 KK 填在最后一行, (K−1)(K−1) 所在列的右一列;
2.若 (K−1)(K−1) 在最后一列但不在第一行,则将 KK 填在第一列, (K−1)(K−1) 所在行的上一行;
3.若 (K−1)(K−1) 在第一行最后一列,则将 KK 填在 (K−1)(K−1) 的正下方;
4.若 (K−1)(K−1) 既不在第一行,也最后一列,如果 (K−1)(K−1) 的右上方还未填数,则将 KK 填在 (K−1)(K−1) 的右上方,否则将 LL 填在 (K−1)(K−1) 的正下方。
现给定 NN ,请按上述方法构造 N∗NN∗N 的幻方。
输入格式
输入文件只有一行,包含一个正整数 NN ,即幻方的大小。
输出格式
输出文件包含 NN 行 ,每行 NN 个整数,即按上述方法构造出的 N∗NN∗N 的幻方,相邻两个整数之间用单空格隔开。
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n); //输入几阶方阵
int num[n][n];
memset(num,0,sizeof(num)); //初始化num矩阵
num[0][n/2]=1; //使第一行中间列为1
int x=0,y=n/2; //当前位置
for(int i=2;i<=n*n;i++)
{ //四个判断条件,其中一种分成两种
if(x==0&&y!=n-1){x=n-1; y++;}
else if(x!=0&&y==n-1) {y=0; x--;}
else if(x==0&&y==n-1) {x++;}
else if(num[x-1][y+1]==0) {x--; y++;}
else {x++;}
num[x][y]=i; //赋值给当前位置
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",num[i][j]);
}
if(i!=n-1) //每n个换一行
printf("\n");
}
return 0;
}
题目描述
小南有一套可爱的玩具小人, 它们各有不同的职业。
有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:
这时singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小人的右数第1个玩具小人的左数第2个玩具小人那里。 ”
小南发现, 这个谜题中玩具小人的朝向非常关键, 因为朝内和朝外的玩具小人的左右方向是相反的: 面朝圈内的玩具小人, 它的左边是顺时针方向, 右边是逆时针方向; 而面向圈外的玩具小人, 它的左边是逆时针方向, 右边是顺时针方向。
小南一边艰难地辨认着玩具小人, 一边数着:
singer朝内, 左数第3个是archer。
archer朝外,右数第1个是thinker。
thinker朝外, 左数第2个是writer。
所以眼镜藏在writer这里!
虽然成功找回了眼镜, 但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜, 或是谜題的长度更长, 他可能就无法找到眼镜了 。 所以小南希望你写程序帮他解决类似的谜題。 这样的谜題具体可以描述为:
有 n个玩具小人围成一圈, 已知它们的职业和朝向。现在第1个玩具小人告诉小南一个包含m条指令的谜題, 其中第 z条指令形如“左数/右数第s,个玩具小人”。 你需要输出依次数完这些指令后,到达的玩具小人的职业。
输入输出格式
输入格式:
输入的第一行包含两个正整数 n,m,表示玩母具小人的个数和指令的条数。
接下来 n 行,每行包含一个整数和一个字符串,以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0 表示朝向圈内,1 表示朝向圈外。 保证不会出现其他的数。字符串长度不超过 10 且仅由小写字构成,字符串不为空,并且字符串两两不同。整数和字符串之间用一个空格隔开。
接下来 m 行,其中第 i 行包含两个整数 ai,si,表示第 i 条指令。若 ai=0,表示向左数 si 个人;若 ai=1,表示向右数 si个人。 保证 ai 不会出现其他的数,1≤si<n。
输出格式:
输出一个字符串,表示从第一个读入的小人开始,依次数完 m 条指令后到达的小人的职业。
输入样例:
7 3
0 singer
0 reader
0 mengbier
1 thinker
1 archer
0 writer
1 mogician
0 3
1 1
0 2
输出样例:
writer
#include<stdio.h>
int main()
{
int n, m;
scanf("%d%d", &n, &m); //输入玩具小人个数和游戏指令次数
int dirt[n]; //储存玩具小人的面向
char name[n][20]; //储存玩具小人的名字
for(int i = 0; i < n; i++)
{ //依次输入玩具小人的面向和名字
char x;
scanf("%d", &dirt[i]);
scanf("%c", &x); //将把数字与名字之间的空格读入吸收
scanf("%s", name[i]);
}
int cur = 0; //当前走到的小人
for(int i = 0; i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
if(a + dirt[cur] == 1) { cur += b; }
else { cur -= b; }
if(cur < 0) { cur += n; } //防止越界
else if(cur >= n) { cur -= n; }
}
printf("%s", name[cur]);
return 0;
}