数据范围:1≤len(str)≤10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
首先分析题目 要求逆序字符串 并不是反向打印 这就要求我们改变字符串的内容
按照题目的意思我们可以设计两个指针 一个指针指向最左边 一个指向最右边 (‘\0’)之前 然后使用这两
个指针再加上一个临时变量把他们的顺序调换一下就可以啦
代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
char arr[10000] = "";
gets(arr);
char tmp = 0;
char* left = arr;
char *right = &arr[(strlen(arr) - 1)];
while (right>left)
{
tmp = *right;
*right = *left;
*left = tmp;
left++;
right--;
}
int i = 0;
for ( i = 0; i < strlen(arr); i++)
{
printf("%c",arr[i]);
}
return 0;
}
第一 不能使用scanf而要使用gets()
因为scanf遇到空格会自动停止 从而导致后面的内容输入不进去第二 不能重头轻尾 最后的printf的格式要写对 博主因为写出算法太激动 导致后面printf写错好几次
第三 最后的for循环使用strlen才可以打印出数组的全部内容 记得不要使用 strlen(arr)-1
题目分析 菱形可以分成上下两部分来打印
我们首先分析上半部分

我们假设这个图形有i行
那么它每一行就具有2i -1个
我们来打印看试试
int main()
{
int line = 0;
scanf("%d", &line);
for ( int i = 1; i <= line; i++)
{
int j = 0;
for ( j = 1; j <=2*i-1 ; j++)
{
printf("*");
}
}
return 0;
}

我们发现 咦 忘记换行了 稍微改进下

我们发现 加上换行之变成这样子了 虽然星星的个数没错但是没有控制它们的位置
我们再观察图形
我们假设第1行有line个空格的 最后一行没有空格的话 那么 每一行的空格数就是line -i

这样子就能完美打印上半部分的菱形啦
那完美再来看下半部分
假设有line行 那么第一行就有2*line -1个
第i行就有(2line-1)- 2(i -1)
假设第一行没有空格 那么第i行的空格就是i个
代码实现如下
for (int i = 1; i <= line; i++)
{
int j = 0;
for (j = 1; j <= i-1; j++)
{
printf(" ");
}
for (j = 1; j <= ((2 * line)-1)-2*(i-1); j++)
{
printf("*");
}
printf("\n");
}
打印出来就是这样子

然后我们再将下方的第一行取消掉
// 下半部分
for (int i = 2; i <= line; i++)
这样就可以完美实现啦

这道题目的主要难点是想到将整个菱形一分为二 并且控制每一行的空格和星号 想明白每一行有多少就可以
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
还是首先分析题目
各位数字的n次方之和
这就要求我们求出这是个几位数
并且求出它的每一位数
之后经过简单的计算就可以啦
判断几位数
tmp = x;
while(tmp)
{
count++;
tmp /= 10;
}
求出各位数字的n次方之和
while (tmp)
{
int ret = 0;
ret = pow(tmp % 10, count);
sum += ret;
/* sum += pow(tmp % 10, count);*/
tmp/= 10;
}
判断
if (x==sum)
{
return 1;
}
else
{
return 0;
}
完整代码如下
int is_Nu(int x)
{
int count = 0;
int tmp = 0;
tmp = x;
while(tmp)
{
count++;
tmp /= 10;
}
// 计算出了count 几位数
int sum = 0;
// 计算每一位数的count次方
tmp = x;
while (tmp)
{
int ret = 0;
ret = pow(tmp % 10, count);
sum += ret;
/* sum += pow(tmp % 10, count);*/
tmp/= 10;
}
if (x==sum)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int i;
for ( i = 0; i <=100000; i++)
{
if (is_Nu(i)==1)
{
printf("%d ", i);
}
}
}
这里需要注意的是x的值可能再函数内部起变化
而我们不想它变化 这个时候就需要使用一个中间变量tmp来代替进行一些计算
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222
题目分析
一共有n项数 每一项数字的结构是i个a
那么我们可以获取两个数字 n a
再用这两个数字构造每一项 就可以得到最终的和了
int main()
{
int a = 0;
int n = 0;
int i = 0;
int sum = 0;
int tmp = 0;
scanf("%d%d", &a, &n);
for(i=0; i<n; i++)
{
tmp = tmp*10+a;
sum += tmp;
}
printf("%d\n", sum);
return 0;
}
代码如上
这里要注意的和第三题一样要注意a的值不能改变 所以要使用一个tmp来接受a的值
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯