尝试从我的输出中删除每个数字,例如直角三角形
Trying to remove each digit from my output, like a right triangle
我正在尝试让我的程序删除每一行的最后一位数字。
我卡住了,不明白为什么 number = number % 10
在第二个 for 循环中不起作用?
#include <stdio.h>
#include <math.h>
int main(){
long long number;
printf("Enter a number\n");
printf("Enter your number = ");
scanf("%d", &number);
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1); i++){
printf("%d ", (number%((int)pow(10, i)))/(int)pow(10, i-1));
}
printf("\n");
}
return 0;
}
我的输出:
Enter a number
Enter your number = 12345
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
我要输出的内容:
Enter a number
Enter your number = 12345
5 4 3 2 1
5 4 3 2
5 4 3
5 4
5
在第二个 for
循环中执行 number = number % 10
是个坏主意,因为它会破坏 number
.
中的数据
要删除数字,您应该减少要在内循环中打印的数字。
这意味着
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1); i++){
应该是
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1) - (j-1); i++){
使得内循环中的迭代按照j
.
减少
另请注意
long long number;
scanf("%d", &number);
调用 未定义的行为 因为 scanf()
中的 %d
需要 int*
但传递的是 long long*
而不是那个。
要通过 scanf()
阅读 long long
,您应该使用 %lld
。
long long number;
scanf("%lld", &number);
附加其他答案我建议作为使用递归函数(不调用任何数学函数)输出给定数字的替代解决方案。
这是一个演示程序。
#include <stdio.h>
FILE * output( unsigned long long n, FILE *fp )
{
const unsigned long long Base = 10;
if ( n / Base != 0 )
{
output( n / Base, fp );
fprintf( fp, " " );
}
fprintf( fp, "%llu", n % Base );
return fp;
}
int main(void)
{
const unsigned long long Base = 10;
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );
unsigned long long n;
if ( !( scanf( "%llu", &n ) == 1 ) || ( n == 0 ) ) break;
putchar( '\n' );
do
{
fputc( '\n', output( n, stdout ) );
} while ( n /= Base );
putchar( '\n' );
}
return 0;
}
程序输出可能看起来像
Enter a non-negative number (0 - exit): 987654321
9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2
9 8 7 6 5 4 3
9 8 7 6 5 4
9 8 7 6 5
9 8 7 6
9 8 7
9 8
9
Enter a non-negative number (0 - exit): 0
我正在尝试让我的程序删除每一行的最后一位数字。
我卡住了,不明白为什么 number = number % 10
在第二个 for 循环中不起作用?
#include <stdio.h>
#include <math.h>
int main(){
long long number;
printf("Enter a number\n");
printf("Enter your number = ");
scanf("%d", &number);
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1); i++){
printf("%d ", (number%((int)pow(10, i)))/(int)pow(10, i-1));
}
printf("\n");
}
return 0;
}
我的输出:
Enter a number
Enter your number = 12345
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
5 4 3 2 1
我要输出的内容:
Enter a number
Enter your number = 12345
5 4 3 2 1
5 4 3 2
5 4 3
5 4
5
在第二个 for
循环中执行 number = number % 10
是个坏主意,因为它会破坏 number
.
要删除数字,您应该减少要在内循环中打印的数字。
这意味着
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1); i++){
应该是
for(int j=1; j<= (log10(number)+1); j++){
for(int i=1; i<= (log10(number)+1) - (j-1); i++){
使得内循环中的迭代按照j
.
另请注意
long long number;
scanf("%d", &number);
调用 未定义的行为 因为 scanf()
中的 %d
需要 int*
但传递的是 long long*
而不是那个。
要通过 scanf()
阅读 long long
,您应该使用 %lld
。
long long number;
scanf("%lld", &number);
附加其他答案我建议作为使用递归函数(不调用任何数学函数)输出给定数字的替代解决方案。
这是一个演示程序。
#include <stdio.h>
FILE * output( unsigned long long n, FILE *fp )
{
const unsigned long long Base = 10;
if ( n / Base != 0 )
{
output( n / Base, fp );
fprintf( fp, " " );
}
fprintf( fp, "%llu", n % Base );
return fp;
}
int main(void)
{
const unsigned long long Base = 10;
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );
unsigned long long n;
if ( !( scanf( "%llu", &n ) == 1 ) || ( n == 0 ) ) break;
putchar( '\n' );
do
{
fputc( '\n', output( n, stdout ) );
} while ( n /= Base );
putchar( '\n' );
}
return 0;
}
程序输出可能看起来像
Enter a non-negative number (0 - exit): 987654321
9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2
9 8 7 6 5 4 3
9 8 7 6 5 4
9 8 7 6 5
9 8 7 6
9 8 7
9 8
9
Enter a non-negative number (0 - exit): 0