65,211
社区成员
发帖
与我相关
我的任务
分享/*2. 基本要求
(1) 要求用C++语言编程,在Visual C++环境下调试完成;
(2) 要求划分功能模块,各个功能分别使用函数来完成;
(3) 源代码程序要求必要的注释。
三、设计方法和基本原理
1. 课题功能描述
设计一个能够查找满足特定条件三位数的程序,要求实现的功能包括:找所有满足特定条件的三位数,然后输出(参见下图)。
2. 问题详细描述
特定条件:一个三位数的平方是一个六位数字,那么这个三位数和它的平方共有9个数字。要满足这9个数字恰好是1到9,没有重复。
要求编写多个函数分别实现上述功能,而后在main函数中进行调用。
3. 问题的解决方案:
根据问题的描述,可以按照程序要求的功能采用结构化的设计思想。
可以利用穷举法,三位数字的范围就是100到999,对每个数字进行判断。
四、主要技术问题的描述
本程序无特殊的需要说明的技术问题。
五、创新要求
在基本要求达到后,进行创新设计:
1. 使用多文件,即主函数和各个函数分别存放在不同的.cpp文件中,在头文件中进行函数原型声明;
2. 把满足条件进行扩展,例如求一个5位的16进制数,它的平方是个10位的16进制数,恰好包括0x1到0xF这15个数字。此问题的一般性描述为:对于一个3N+1进制数来说,有一个N位的3N+1进制数和它的平方(一个2N位的3N+1进制数),由1到3N组成。 */
#include "stdafx.h" // VC编译器预编译必须的头文件,我的编译器是VC2003
#include <iostream>
using namespace std; //导入名称空间std,因为下面要使用到std中cout对象,也可以使用using std::cout; 或者在使用cout的地方加前缀,即std::cout;
int CheckNumber(int number); // 这是函数的原型,number为传入函数的参数,返回一个int数据
int CheckNumber(int number) // 以下是函数的具体定义
{
int A[10]={0,1,2,3,4,5,6,7,8,9}; // 定义个int的数组,共有10个元素,并将其值初始化为0-9
int d_number = number * number; // 计算参数的平方
int b;
do
{
b = number % 10; // 求10的余数,即得到number的个位数的值
number = number / 10; //去掉number的个位数:除以10并去掉可能的小数位(因为number是int类型,所以如果没有被10尽除,小数位将在自动类型转换时丢弃)
if ( A[b] != 0) // 检查个位数的值对应数组中的数字,如果不是0表示未出现过
A[b]=0; // 将其置0,表示已经出现了这个数字
else
return(0); // 如果是0,表示已经出现了这个数字,重复!肯定不满足条件,退出函数,返回0
} while (number != 0); // number=0退出循环,即number的每个位数都处理完毕了
do //原理和上面的循环一样,检查的数组是其平方值即d_number的各个位数
{
b = d_number % 10;
d_number = d_number / 10;
if (A[b] != 0)
A[b] = 0;
else
return(0);
} while (d_number != 0);
for (int i = 1; i < 10; i++) // 这个循环检查数组中所有的值是否0,如果都是0,则退出循环时i=10,即遍历了所有10个数
{
if (A[i] != 0)
break; // 如果不是0,则退出循环
}
if (i < 10) // 如果遍历了10个数,即表示满足条件
return(0); // 不满足条件,退出函数,返回0
else
return(1); // 满足条件,退出函数,返回1
}
int main()
{
cout << "满足条件的数字为:" << endl;
for(int i=100; i < 1000; i++) // 循环,检查100-999的所有数字
{
if CheckNumber(i)) //调用函数检查当前数字i
cout << i << endl; //满足条件则显示该数字
}
cout << "输出完毕!" << endl;
getchar(); // 等待一个按键,相当于暂停一下,以便查看结果
return(0);
}
//以上的程序放在一个文件中的,多文件如下组织:
//==========================================================================================================文件1
//定义头文件名称为myheadfile.h,并将头文件放到工作目录下
int CheckNumber(int number); // 文件内容只有一个语句,即函数原型
//==========================================================================================================文件2
#include "stdafx.h" // VC编译器预编译必须的头文件,我的编译器是VC2003
#include "myheadfile.h" // 把自己的头文件包含进来,因为这个案例很简单,函数定义中没有使用const常量或其他函数,所以这儿不包含也没有关系
//定义函数的定义文件func.cpp,即确定函数的具体代码,完成该cpp文件后需要加入到项目中以便链接产生最终执行程序
int CheckNumber(int number) // 以下是函数的具体定义
{
int A[10]={0,1,2,3,4,5,6,7,8,9}; // 定义个int的数组,共有10个元素,并将其值初始化为0-9
int d_number = number * number; // 计算参数的平方
int b;
do
{
b = number % 10; // 求10的余数,即得到number的个位数的值
number = number / 10; //去掉number的个位数:除以10并去掉可能的小数位(因为number是int类型,所以如果没有被10尽除,小数位将在自动类型转换时丢弃)
if ( A[b] != 0) // 检查个位数的值对应数组中的数字,如果不是0表示未出现过
A[b]=0; // 将其置0,表示已经出现了这个数字
else
return(0); // 如果是0,表示已经出现了这个数字,重复!肯定不满足条件,退出函数,返回0
} while (number != 0); // number=0退出循环,即number的每个位数都处理完毕了
do //原理和上面的循环一样,检查的数组是其平方值即d_number的各个位数
{
b = d_number % 10;
d_number = d_number / 10;
if (A[b] != 0)
A[b] = 0;
else
return(0);
} while (d_number != 0);
for (int i = 1; i < 10; i++) // 这个循环检查数组中所有的值是否0,如果都是0,则退出循环时i=10,即遍历了所有10个数
{
if (A[i] != 0)
break; // 如果不是0,则退出循环
}
if (i < 10) // 如果遍历了10个数,即表示满足条件
return(0); // 不满足条件,退出函数,返回0
else
return(1); // 满足条件,退出函数,返回1
}
//==========================================================================================================文件3
//创建项目,main函数文件
#include "stdafx.h" // VC编译器预编译必须的头文件,我的编译器是VC2003
#include <iostream>
#include "myheadfile.h" // 把自己的头文件包含进来
using namespace std; //导入名称空间std,因为下面要使用到std中cout对象,也可以使用using std::cout; 或者在使用cout的地方加前缀,即std::cout;
int main()
{
cout << "满足条件的数字为:" << endl;
for(int i=100; i < 1000; i++) // 循环,检查100-999的所有数字
{
if CheckNumber(i)) //调用函数检查当前数字i
cout << i << endl; //满足条件则显示该数字
}
cout << "输出完毕!" << endl;
getchar(); // 等待一个按键,相当于暂停一下,以便查看结果
return(0);
}
int dec(int num,int *res)
{
int i=0;
while(num>0)
{
res[i++]=num%10;
num/=10;
}
return i;
}
int main ()
{
int i,j,num,i2,bit_map[10]={0};
int res[10]={0};
bool sign;
for(i=100;i<1000;++i)
{
sign=true;
i2=i*i;
i2=i2*1000+i;
num=dec(i2,res);
for(j=0;j<num;j++)
{
if(bit_map[res[j]]==0)
bit_map[res[j]]=1;
else
{
//cout<<i<<"*"<<i2<<endl;
sign=false;
break;
}
}
if(sign)
cout<<"num "<<i<<" and sum: "<<i2<<"are good"<<endl;
}
return 0;
}