位数算法
取数算法(分正(要知道位数),逆两种)
正:int t, n; 逆:int t;
for (i = k - 1; i >= 0; i--) while(s!=0)
{ {
t = s / pow(10.0, (float)(i)); t=s%10;
n = t % 10; s=s/10; } printf("%d",t);
}
逆向(回文算法)
int n=0(赋初值很重要)
while(s!=0)
{
t=s%10;//逆向取位
s=s/10
n=n*10+t;//回文
}
规则图形的规则排序问题:()
这类题目一般都是用大循环加上若干小循环实现,外层for是用于“行”,内层for则是用于每行打印内容的一个“循环的次数”(很考验逻辑思维),难点在于每个循环条件的确立
1、有时候内层循环的内容可能与行序有函数关系,则内层循环的条件就与外层i有关
2、也会出现与总行数和行序都有关的,则内层循环的判断条件就会与i和n有关
金字塔
下面这个金字塔例子就是其内部三个循环均与外层循环有关,也就是都与‘行数’有关
1、空格问题:
易知每行空格的数量随行序增加而减少,则为降序打印,且总行数发生改变时,第一行的空格打印循环次数随之增加,即其判断条件即与行序有关,又与总行数有关,则其判断条件就会与n,i有关。
2,字母升序,降序循环打印问题:
易知每行字母无论升序还是降序,其循环打印的字母个数均随行序增加而增加,则为升序打印,且易知总行数发生改变时,第一行的字母打印循环次数不变。所以其判断条件就只与行序有关所以判断条件就只会与i有关
#include <stdio.h>
int main()
{
char a;
int n;
printf("输入一个字母\n");
scanf("%c",&a);
printf("输入你想要输入的行数\n");
scanf("%d",&n);
int i,j,k,m,c;
for(i=1;i<=n;i++)
{
c=a-1;
for(j=1;j<=n-i;j++)//升
{
printf(" ");
}
for(k=1;k<=i;k++)
{
c=c+1;
printf("%c",c);
}
for(m=1;m<=i-1;m++)
{
c=c-1;
printf("%c",c);
}
printf("\n");
}
return 0;
}
菱形打印
#include <stdio.h>
int main()
{
int n;
printf("你想输入几行(奇数):");
scanf("%d", &n);
while (n % 2 == 0)
{
printf("输入错误,请重新输入奇数:");
scanf("%d", &n);
}
int i, t, k;
for (i = 1; i <= (n + 1) / 2; i++)//上半部分
{
for (t = 1; t <= (n + 1) / 2 - i; t++)//降
{
printf(" ");
}
for (k = 1; k <= 2 * i - 1; k++)//升
{
printf("*");
}
printf("\n");//每一行打印完成后,换行,继续下一行的打印
}
int j, m, g;
for (j = 1; j <= i - 2; j++)//下半部分
{
for (m = 1; m <= j; m++)//升
{
printf(" ");
}
for (g = 1; g <= -2 * j + n; g++)//降
{
printf("*");
}
printf("\n");每一行打印完成后,换行,继续下一行的打印
}
return 0;
}
其里面主要的问题有
*号的数量为升序时:
空格:为降序打印
*号:为升序打印(奇数升序(等差数列知识),2n-1)
*号的数量为降序时:
空格:为升序打印
*号:为降序打印(奇数降序(等差数列知识),-2*j+n)
所以将要分成两块大循环,里面再接不同类型的小循环;
所以就可用刚才给出的 内容数量升降序 的结论来确定小循环中的判断条件