user-0 提问: splunk公司的笔试题，求解

回复:
user: user-1
content: 好几年前的东西翻起来做啥 除了尾巴不能有4.  40也不行吧。 400也不行吧。

user: user-2
content: 在VC++6.0的运算结果为 请输入柜子总量： 30 第1个柜子编号为1 第2个柜子编号为2 第3个柜子编号为3 第4个柜子编号为5 第5个柜子编号为6 第6个柜子编号为7 第7个柜子编号为8 第8个柜子编号为9 第9个柜子编号为10 第10个柜子编号为11 第11个柜子编号为12 第12个柜子编号为13 第13个柜子编号为15 第14个柜子编号为16 第15个柜子编号为17 第16个柜子编号为18 第17个柜子编号为19 第18个柜子编号为20 第19个柜子编号为21 第20个柜子编号为22 第21个柜子编号为23 第22个柜子编号为25 第23个柜子编号为26 第24个柜子编号为27 第25个柜子编号为28 第26个柜子编号为29 第27个柜子编号为30 Press any key to continue

user: user-2
content: #include<stdio.h>  int main(void) { 	int n; 	int i, j = 1;  	printf("请输入柜子总量：\n"); 	scanf("%d",&n);  	n+=1;  	for(i = 1;i <n;i++, j++) 	{ 			if(i%10==4) 			{ 				i+=1; 				printf("第%d个柜子编号为%d\n",j, i); 			} 			else 				printf("第%d个柜子编号为%d\n",j, i);  	}   	return 0; }

user: user-3
content: 去除的数:4,14,24..... 假设输入为in 假如去除n个数 那么4+10.(n+1)＞in＞4+10.n 解出n in+n即为要的输出结果

user: user-4
content: 这是我敲的代码，过程有点麻烦，但运行结果是正确的 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int main() {       int num;         char a[10];         while (scanf("%d", &num) != EOF)         {                 int count = 0;                 for (int i = num; i > 0; i--)                 {                        itoa(i, a, 10);                         for (int j = 0; a[j] != '\0'; j++)                                 if (a[j] == '4')                                 {                                         count++;                                         break;                                 }                 }                 itoa(num + count, a, 10);                 for (int j = 0; a[j] != '\0'; j++)                          if (a[j] == '4')                         {                                 count += pow(10, (strlen(a) - 1 - j));                         }                 printf("%d\n", num + count);        }  } 这是运行结果 可以的话 望采纳！

user: user-5
content: 输入4对应是顺序号，输出5的意思4去掉所以是5 输入可以1,2,3,4,5。。。。。13,14。。。 输出是    1,2,3,5,6。。。13，15,16。。。。。

user: user-6
content: 遇4，加一没错

user: user-7
content: 引用 16 楼 henryldz2015 的回复:没人认真看我的程序吗？都解决了，就是遇4加1的问题啊，关键是谁遇到4，拜托先看程序好不？楼主给分！！！ [quote=引用 11 楼 henryldz2015 的回复:] #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int overoffNumFour(int num) {     int count=0; 	int i=1; 	for (;i<=num;++i) 	{ 		if (4==(i+count)%10)              //遇4加1！！！！！！！！！！！！！！！解决一切问题！！！！！ 		{ 			++count; 		} 	} 	return num+count; } int main(int argc, char *argv[])  { 	int num; 	while(1) 	{ 		printf("Please input number:"); 		scanf("%d",&num); 		printf("Output numerber: %d\n",overoffNumFour(num)); 	} 	return 0; }[/quote]  输入：131 输出：146 不行啊

user: user-8
content: #include <stdio.h>  #define STANDNUM        4 #define STANDLOOP  10  int cal_out_num(int input_num) {     int temp_num = 0;     int cal_num = 0;      if(input_num < STANDNUM) {         return 0;     }     else     {         temp_num = input_num/STANDLOOP;         cal_num = input_num % STANDLOOP;         if (cal_num >= STANDNUM)             temp_num++;         if ((temp_num + input_num) % STANDLOOP == STANDNUM)             temp_num++;         return temp_num;     } }   int main(void) {     int input_num=0;     int skip_num=0;      while(1)     {         printf("please input the number:\n");         scanf("%d",&input_num);         skip_num=cal_out_num(input_num);         printf("skip number = %d\n", skip_num);         printf("input number:%d\n",input_num);         printf("output number:%d\n",input_num+skip_num);     } }

user: user-9
content: 全是大神mark

user: user-10
content: 引用 74 楼 qq_29499869 的回复:代码如下，测试了多组，应该没什么问题吧 #include <iostream>   #include<string>  using namespace std; int main() { 	string nine = "012356789"; 	string ID; 	int num,  b; 	cin >> num; 	do { 		b = num % 9; 		num = num / 9; 		ID = nine[b] + ID; 	} while (num > 0); 	cout << ID + '\n'; 	system("pause"); 	return 0; }  这个好像是正解了 赞~

user: user-11
content: 如果输入数不带4，可以算出输入数前带有4的整数个数，然后相加； 如果输入数带4，算出这个数后最小的不含4数，算出这个最小数前带有4的整数个数，然后相加。

user: user-12
content: int main() { 	int n = 0; 	int ofs = 0; 	cin >> n;  	for (int i = 4; i <= n; i++) 	{ 		if (i % 10 == 4) 		{ 			ofs++; 		} 		else if ((i + ofs) % 10 == 4) 		{ 			ofs++; 		} 	}  	cout << "out box:" << n + ofs << endl;  	return 0; }

user: user-13
content: 两个思路： 1. 先sscanf得到数字, 再按10进制提取每一位的数字,遇到是4的改掉 2. 捕获key_up事件,若某次按下的是数字键4(包括小键盘的4),直接改为其他的

user: user-14
content: 想到九进制的，算是理解到了问题的本质。

user: user-12
content: int main() { 	int n = 0; 	int ofs = 0; 	cin >> n;  	for (int i = 4; i <= n; i += 10) 	{ 		if (i % 10 == 4) 		{ 			ofs++; 		} 	} 	cout << "out box:" << n + ofs << endl;  	return 0; }

user: user-15
content: #include<stdio.h> int main(){  	int num;  	while(1) 	 { 	 	scanf("%d",&num); 	 	for(int i=1;i<=num;i++) 	 	{ 	 		if (4==i%10|| 	 		4==i/10%10|| 	 		4==i/100%10|| 	 		4==i/1000%10) 	 		{ 	 			num++; 			} 		} 		printf("%d",num); 	} 	return 0; }

user: user-16
content: 大神太多了.

user: user-17
content: 效率略低，差评！，但是想不到更好的办法了 #include "stdafx.h" #include "string" #include <stdio.h> #include "iostream" #include "vector" #include "algorithm" using namespace std;  bool HasFour(int id) { 	while (id) 	{ 		if (id%10 == 4) 		{ 			return true; 		} 		id /= 10; 	} 	return false; }  int ExceptFour(int id) { 	vector<int> vecNum; 	int iNumTem = 0; 	for(int i=0; i < (id+1); i++)//遍历每个值并为其分配唯一对应的数值 	{ 		iNumTem = i; 		vector<int>::iterator vecNumFind =	find(vecNum.begin(), vecNum.end(), iNumTem); 		while(HasFour(iNumTem) || vecNumFind != vecNum.end())//如果包含4或者如果已经被分配了，需要往后继续查找 		{ 			iNumTem++; 			vecNumFind = find(vecNum.begin(), vecNum.end(), iNumTem); 		} 		vecNum.push_back(iNumTem); 		cout<< i<<"  "<<vecNum[i]<<endl; 	}  	return 0;  }   int _tmain(int argc, _TCHAR* argv[]) { 	int iNum = 50; 	ExceptFour(iNum); 	 	return 0; }

user: user-18
content: 引用 89 楼 user-18 的回复:[quote=引用 88 楼 user-18 的回复:] 实际就是10进制转9进制的问题，转的时候凡是大于等于4的数字就加上1. int fun(int n) {     int t = 0;     int d = 1;     int m = 0;     while(n)     {         m = n % 9;         if(m >= 4) ++ m;         t += m *d;         d *= 10;         n /= 9;     }     return t; } 还是不对，考虑有误，抱歉。[/quote] 再想想后，觉得应该是对的，就是9进制问题。