质(素)数、歌德巴赫、水仙数、完美数等均需取数之各位处理。
int 数字 = 369258147;/*质(素)数、歌德巴赫、梅森质数、完美数等均需取数之各位处理。*/
int[] 位数组 = new int[数字.ToString().Length];/*获取任意位数各位。unchecked*/
foreach (int 序 in Enumerable.Range(0, 位数组.Length))
位数组[序] = int.Parse(数字.ToString()[序].ToString());
/*虽然几经转换,处理语句简单多了。不知C#是否有指向内存地址来获取各位数值?*/
int[] 位幕组 = Enumerable.Repeat(1, 位数组.Length).ToArray();
foreach (int 幕 in Enumerable.Range(0, 3))/*数各位任意幕运算本例为3次幕。*/
foreach (int 序 in Enumerable.Range(0, 位幕组.Length)) 位幕组[序] *= 位数组[序];
Console.WriteLine(string.Join(" ", 位幕组));
/*这样写和上述循环写法有多大区别?除了看起来语法简洁,少用几个变量外。*/
int[] 位数组1 = 数字.ToString().ToCharArray().Select(类型转换 => int.Parse(类型转换.ToString())).ToArray();
Console.WriteLine(string.Join(" ", 位数组1));
int aa = 1234, bb = (int)Math.Pow(10, aa.ToString().Length - 1);
Console.WriteLine(string.Join(" ", aa.ToString().ToCharArray()));
do
{
Console.WriteLine(aa / bb);
aa -= aa / bb * bb;
bb /= 10;
} while (aa > 0);
Int64 输入数, 位 = 0;/*int32=10位,int64=19位(在32位机上int64=14位?)*/
List<Int64> 动态位数 = new List<Int64>();
Console.WriteLine("输入任意整数不超过指定 Int64 范围位数: ");
输入数 = Int64.Parse(Console.ReadLine());
do
{
动态位数.Add(输入数 % 10);
输入数 /= 10;
位++;
} while (输入数 > 0);
Console.WriteLine("输入数为: {0}位\n", 位);
动态位数.Reverse();/*输出反转即可。*/
Console.WriteLine(string.Join(" ", 动态位数));
Int64[] 位组 = new Int64[位 - 1];
Int64[] 位数 = new Int64[位];
Int64 基 = 1;
if (位 == 1) 位数[位 - 1] = 输入数;
else
{
for (int 序 = 0; 位 - 1 != 序; 序++)
{
基 *= 10;
位组[位 - 2 - 序] = 基;
}
for (int 序 = 0; 序 != 位 - 1; 序++)
Console.WriteLine("10的{0}幕{1}\n", 位 - 1 - 序, 位组[序]);
基 = 输入数;
for (int 序 = 0; 序 != 位 - 1; 序++)
{
位数[序] = 基 / 位组[序];
基 %= 位组[序];
if (位组[序] == 10) if (基 <= 10) 位数[序 + 1] = 基;
}
}
#define 数位32 10/*定义宏*/
#define 数位64 14
#define 数位64 19
int 输入数(0), 位(0);
cout << "输入任意整数不超过指定 Int 范围位数:10位" << endl;
cin >> 输入数;
int *动态 = new int();/*默认初始化0序值=0*/
//int *动态 = new int(9);/*初始化0序值=9*/
//int *动态 = new int[数位16];
//int *动态 = new int[输入数];/*只有使用NEW才可以使用变量作为指定维数值*/
do
{
动态[位++] = 输入数 % 10;/*后自增应用*/
输入数 /= 10;
} while (输入数 > 0);
printf("输入数为: %d位\n", 位);
for (int 序 = 位 - 1; 序 >= 0; 序--)
printf("%d ", 动态[序]);
delete 动态;/*在C++中使用NEW后就要配套使用DELETE来手动释放内存返回给系统,否则,将一直占用内存直到重启电脑.*/
//delete[] 动态;/*只适合于已经指定的纬度数组*/
printf("\n");
进一步学C++才知道原来动态数组是这样的概念:new 表达式需要指定指针类型以及在方括号中给出的数组维数,该维数可以是任意的复杂表达式。创建数组后,new 将返回指向数组第一个元素的指针。在自由存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象。
显然之前一帖的写法是错误的int *动态 = new int[输入数];,因为int位数最大只能10位,明显当输入一个整数大于10的话则数组长度已经超过了,是没必要的,只要设定合适长度的数组位数就能满足需求,更不用说当输入9位数去当数组维度了.正确的应该修改如下,并在结束后释放内存.
int 输入数(0), 位(0);
cout << "输入任意整数不超过指定 Int 范围位数:10位" << endl;
cin >> 输入数; int *动态 = new int[10];
do
{
动态[位] = 输入数 % 10;
输入数 /= 10;
位++;
} while (输入数 > 0);
printf("输入数为: %d位\n", 位);
for (int 序 = 位 - 1; 序 >= 0; 序--)
printf("%d ", 动态[序]);
delete[] 动态;
printf("\n");
int 数位[10]{0}, 位(0);
do
{
数位[位++] = 输入数 % 10;
} while (输入数 /= 10);
void 数字位(static int 输入数 = 123456789)/*视操作系统确定位数限制*/
{
int 数位(0);
数位 = 输入数 % 10;
if ((输入数 /= 10))
数字位(输入数);
cout << 数位 << " ";
};
int 输入数, 位 = 0;
cout << "输入任意整数不超过指定 Int 范围位数:" << endl;
cin >> 输入数;
list<int> 动态;
do/*输出各位数*/
{
动态.push_back( 输入数 % 10);
输入数 /= 10;
位++;
} while (输入数 > 0);
printf("输入数为: %d位\n", 位);
list<int>::iterator 元素头 = 动态.begin();
while (元素头 != 动态.end())
cout << *元素头++ << " ";
cout << endl;
list<int>::iterator 元素尾 = 动态.end();
while (元素尾 != 动态.begin())
cout << *--元素尾 << " ";
printf("\n");
以上几种写法是C或C++的。