【发布时间】:2010-11-02 03:25:34
【问题描述】:
我是编程新手,但遇到了一个问题。我希望我的程序识别给定数字中的单独数字,例如如果我输入4692,它应该识别数字并打印4 6 9 2。是的,不使用数组。
【问题讨论】:
-
很好的面试问题。谢谢!
我是编程新手,但遇到了一个问题。我希望我的程序识别给定数字中的单独数字,例如如果我输入4692,它应该识别数字并打印4 6 9 2。是的,不使用数组。
【问题讨论】:
如果您是编程新手,可以解决一个完美的递归问题...
4692/1000 = 4
4692%1000 = 692
692/100 = 6
692%100 = 92
92/10 = 9
92%10 = 2
您应该了解现在应该使用的循环,以便它适用于任何数字。 :)
【讨论】:
一年没写过 C 代码,但这应该可以。
int i = 12345;
while( i > 0 ){
int nextVal = i % 10;
printf( "%d", nextVal );
i = i / 10;
}
【讨论】:
i 的值打印 5 次:“123451234123121”。即使您打印nextVal 而不是i,您的操作顺序也错误,并且会打印“54321”。
简单又好看
void PrintDigits(const long n)
{
int m = -1;
int i = 1;
while(true)
{
m = (n%(10*i))/i;
i*= 10;
cout << m << endl;
if (0 == n/i)
break;
}
}
【讨论】:
另一种方法是有两个循环。
1) 第一个循环:倒数。
int j = 0;
while( i ) {
j *= 10;
j += i % 10;
i /= 10;
}
2) 第二个循环:从右到左打印数字。
while( j ) {
std::cout << j % 10 << ' ';
j /= 10;
}
这是假设您希望从右到左打印数字。我注意到这里有几个解决方案没有这个假设。如果没有,那么只需第二个循环就足够了。
【讨论】:
i 以零结尾,则第 1 部分会中断,因为 j 会在开头保持为零,将其乘以 10 不会对其产生任何影响。
我认为这个想法是打印非重复数字(否则会太简单)...好吧,您可以跟踪已经打印的整数,而无需将数组编码为另一个整数。
一些伪C,给你一个线索:
int encoding = 0;
int d;
while (keep_looking()) {
d = get_digit();
if (encoding/(2**d)%2 == 0) {
print(d);
encoding += 2**d;
}
}
【讨论】:
d**2?我想你的意思是d*d。
** 是 Fortran 的幂运算符。 C 没有幂运算符。您可以将2**d 替换为1 << d。
如果您只想打印数字中的数字,这是一个简单的解决方案。
#include <stdio.h>
/**
printdigits
*/
void printDigits(int num) {
char buff[128] = "";
sprintf(buff, "%d ", num);
int i = 0;
while (buff[i] != '\0') {
printf("%c ", buff[i]);
i++;
}
printf("\n");
}
/*
main function
*/
int main(int argc, char** argv) {
int digits = 4321;
printDigits(digits);
return 0;
}
【讨论】:
sprintf() 覆盖它,为什么还要初始化buff?另外,如果你从不使用char *p,为什么还要使用它?
int 在大多数平台上最多只能容纳 40 亿个数字,因此使用 10 位数字(11 个带有 nul 终止符的字符)应该是安全的。如果您担心 64 位,那仍然只有大约 20 到 25 个字符。
对吗
int main()
{
int number;
cin>>number;
int nod=0;
int same=number;
while(same){
same/=10;
nod++;
}
while(nod--){
cout<<(int)number/(int)pow10(nod)%10<<"\t";
}
return 0;
}
【讨论】: