题:三位数的整数,将首位移至末位形成的数是原数的3倍加2,求原数。
三位十进制整数的表示(首位为y,后续为x):100y+x(0<=x<=99),转换后的三位数:10x+y,于是得到10x+y=3(100y+x)+2,化简:7x-2=299y,其中:1<=y<=9。计算机穷举:y=1或8,由x的约束条件,取y=1,则x=43,原数为143,移位后431.
传统的代数解法主要在于十进制整数的表示方法。
另一种,参照数组移位的方法直接穷举,将程序进行优化:由于三位数的限制,对首位优化:1<=y<=3。第二位优化,由于是原数3倍+2,而y>=1,所以第二位必定>=3。约束后的情形:
1 3 x ...
2 3 x...
3 3 x...
可能还可以进一步优化,暂时放在这。这段代码穷举三位数范围的解,4,5,6....位依此类推。
#include <iostream> using namespace std; int main() { int a[3]; for(int i=1;i<=3;i++)/*百位*/ { a[0]=i; for(int j=3;j<=9;j++)/*十位*/ { a[1]=j; for(int k=0;k<=9;k++)/*个位*/ { a[2]=k; if(((a[0]*100+a[1]*10+a[2])*3+2)==(100*a[1]+10*a[2]+a[0])) { for(int v=0;v<3;v++) cout<<a[v]<<" "; } } } } return 0; }