Android文件存储

Android文件存储
15.1文件存储简介
Android中的数据存储方式有五种,分别是文件存储、sharedpreferences、sqlite数据库、contentprovider以及网络存储
在这里插入图片描述

  • 文件存储是Android中最基本的一种数据存储方式,它与java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中
  • Android中的文件存储分为内部存储和外部存储

在这里插入图片描述
15.2SharedPreferences的使用

  • SharedPreferences是Android平台上一个轻量级的存储类,用于存储一些
    应用程序的配置参数,例如用户名、密码、自定义参数的设置等。
  • SharedPreferences中存储的数据是以key/value键值对的形式保存在XML文件中,该文件位于“data/data/<packagename>/shared_prefs"文件夹中。
参数返回
页面之间传递参数:
1.构建Intent
//1.返回结果的跳转
Intent intentanew Intent(MainActivity.this,Main2Activity.class);
//任务核:线程
startActivityForResult(intent,666);
2.设置接收返回结果
brotected void onActivityResult(int requestcode, int resultcode, anullable Intent data)
super.onActivityResult(requestcode,resultcode,data);
if(requestcode==666&&resultcode==RESULT_OK){
tv.setText(data.getstringExtra("data"));
system.out.println("返回成功");
}

15.3 SharedPreferences的使用
·存储数据
·SharedPreferences sp=getSharedPreferences(“data”,MODE_PRIVATE);
· Editor editor=sp.edit();
·editor.putString("name","传智播客");
·editor.putInt(“age”,8);
·editor.commit():
·取出数据
·SharedPreferences sp=context.getSharedPreferences();
·String data=sp.getString(“name”,"");
·编辑数据
·SharedPreferences sp=context.getSharedPreferences();
·Editor editor=sp.edit();
·editor.remove(“name”):
·editor.clear();
·editor.commit();
总结:
1.SharedPreferences
·SharedPreferences是Android平台上一个轻量级的存储类,用于存储一些应用程序的配置参数,例如用户名、
密码、自定义参数的设置等。
存储数据
sharedpreferences sp = getsharedPreferences (“data”, MODE_PRIVATE);
Editor editor=sp.editO;
editor.putstring("name","传智播客");
editor.putInt(“age”,8);
editor.commit();
取出数据
SharedPreferences sp = context.getsharedpreferences O;
string data = sp.getstring(“name”,"");
编辑数据
SharedPreferences sp=context.getsharedpreferences O;
Editor editor=sp.editO;
editor.remove(“name”);
editor.clear();
editor.commito;

<think>嗯,用户让我用C语言100的阶乘,还要画流程图。首先,我得想想怎么处理这么大的数。普通的整数类型肯定不行,C语言里的int或者long long最多只能存到20!左右,100!远远超过了这个范围。那应该用数组来模拟大数运算,对吧? 然后,我需要确定数组的大小。100!有多少位呢?可以用对数来估算。log10(100!)=∑log10(i)1100,加起来大概是多少?或者用斯特林公式近似计算。斯特林公式是n!≈sqrt(2πn)(n/e)^n。算一下的话,100!的自然对数大概是ln(100!) = 100*ln(100) - 100 + 0.5*ln(200π),然后转成log10的话,除以ln(10)。或者直接找资料,已知100!有158位,所以数组长度需要至少158位,加上进位可能需要更多,比如200个元素的数组。 接下来,用数组的每个元素存一位数字,比如arr[0]是个位,arr[1]是十位,依此类推。初始化数组为1,因为阶乘从1开始乘。然后循环从1100,每次乘以当前的数,处理进位。 比如,当计算到5!的时候,数组里存的是120,但需要处理每一位的乘积和进位。比如当前数字4,数组里的数是[0,2,1](即120),乘以4的时候,每一位都要乘,然后处理进位。 那么具体步骤应该是这样的:初始化数组,长度设为200,全部初始化为0,然后arr[0] = 1。然后从2循环到100,每次乘法后处理进位。比如,外层循环是乘数i(从2到100),内层循环处理数组的每一位乘以i,并处理进位。 比如,当i=2时,数组是[1],乘2后变成[2],没有进位。然后i=3,乘后是6。i=4,6*4=24,数组变成[4],进位是2,所以数组变为[4,2],即24。以此类推,直到i=100。 在这个过程中,需要记录当前数组的有效长度,避免每次都遍历整个数组。比如,每次进位可能增加数组的长度,所以需要维护一个变量,比如length,表示当前有效位数。 接下来,编写代码的大致结构应该是: 定义一个足够大的数组,比如int result[200] = {0}; result[0] = 1; int length = 1; 然后循环i从2到100: int carry = 0; for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; carry = product / 10; } 处理剩余的carry,比如当carry大于0时,需要将carry的每一位依次加到数组后面,增加length。 比如,当carry是12,那么循环处理,将12分解为2和1,依次添加到数组的后面,同时length增加2。 这样,每次乘法后,都能正确更新数组中的每一位,并处理进位。 测试这个逻辑是否正确。比如,计算4!的时候: 初始数组是[1], length=1. i=2: j=0: product=1*2+0=2, result[0]=2, carry=0. 循环结束,carry=0,不处理。length仍为1. i=3: j=0: product=2*3+0=6, result[0]=6, carry=0. length=1. i=4: j=0: product=6*4 +0=24. result[0]=24%10=4, carry=24/10=2. 循环结束,carry=2>0,进入处理carry的循环: 此时,j从length=1开始,但需要将carry分解。比如,carry=2,添加到result[1]=2,length变为2. 此时数组是[4,2],即24,正确。 继续这个过程直到i=100,就能得到正确的结果。 接下来是流程图。流程图的大致步骤应该是: 开始 -> 初始化数组,设置result[0]=1,length=1 -> 进入循环i从2到100 -> 对于每个i,初始化carry=0,遍历数组的每一位进行乘法并处理进位 -> 处理完所有位后,处理剩余的carry,扩展数组长度 -> 循环结束?否的话继续下一个i -> 循环结束后,逆序输出数组中的数字 -> 结束。 流程图的各个部分需要用对应的图形表示,比如开始/结束用椭圆,处理操作用矩形,判断用菱形,流程线连接。 可能需要注意的细节是,处理carry的时候可能需要多次循环,比如当carry大于等于10的时候,需要分解成多个位数。例如,carry=123,需要分解为3,2,1,依次存入数组,并将length增加3。所以在代码中,处理carry的部分应该是一个循环,直到carry为0。 另外,输出的时候需要逆序输出数组,因为数组的第0位是个位,而输出应该从最高位开始。 现在,我需要将这个过程转化为C代码,并确保数组大小足够,处理进位正确。测试一下,比如计算5!是否正确。当i=5时,之前的数组是[4,2](即24),乘以5的话: j=0: 4*5=20 + carry 0 → 0,carry=20/10=2 → result[0]=0, carry=2. j=1: 2*5=10 + carry 2=12 → result[1]=2, carry=1. 循环结束后,carry=1,所以处理carry,result[2]=1,length变为3。数组是[0,2,1],即120,正确。 看来逻辑是对的。那这样代码应该没问题。现在,编写代码的大致结构: #include <stdio.h> int main() { int result[200] = {0}; result[0] = 1; int length = 1; for (int i = 2; i <= 100; i++) { int carry = 0; for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; carry = product / 10; } while (carry > 0) { result[length] = carry % 10; carry /= 10; length++; } } printf("100! = "); for (int i = length - 1; i >= 0; i--) { printf("%d", result[i]); } printf("\n"); return 0; } 这样应该可以正确计算100!。然后流程图部分需要画出来,不过用户要用文字描述。流程图的主要步骤: 1. 开始 2. 初始化数组,设置result[0]=1,length=1 3. 循环i从2到100: a. 初始化carry=0 b. 遍历数组的每一位j,计算乘积和进位 c. 处理剩余的carry,扩展数组长度 4. 循环结束后,逆序输出数组 5. 结束 这样分步骤描述流程图,用户应该可以理解。</think>### C语言100!的步骤说明 100!(100的阶乘)是一个极大的整数,远超C语言基本数据类型的范围。需使用**数组模拟大数运算**。步骤如下: --- #### 1. 核心思路 - **数组存储**:用数组的每一位存储结果的一个数字,例如`arr[0]`存个位,`arr[1]`存十位,依此类推。 - **逐位计算**:从1开始,依次乘以2、3、...、100,每次乘法后处理进位。 --- #### 2. 代码实现 ```c #include <stdio.h> int main() { int result[200] = {0}; // 初始化数组,足够存储158位 result[0] = 1; // 初始值为1(0! = 1) int length = 1; // 当前有效位数 // 计算阶乘 for (int i = 2; i <= 100; i++) { int carry = 0; // 进位值 // 逐位乘法 for (int j = 0; j < length; j++) { int product = result[j] * i + carry; result[j] = product % 10; // 当前位结果 carry = product / 10; // 新的进位 } // 处理剩余进位 while (carry > 0) { result[length] = carry % 10; carry /= 10; length++; } } // 输出结果(逆序打印) printf("100! = "); for (int i = length - 1; i >= 0; i--) { printf("%d", result[i]); } printf("\n"); return 0; } ``` --- #### 3. 流程图 ```plaintext 开始 ↓ 初始化数组:result[0]=1,length=1 ↓ 循环i从2到100: ├─→ 初始化carry=0 ↓ │ 循环j从0到length-1: │ ├─→ 计算product = result[j] * i + carry │ ├─→ result[j] = product % 10 │ └─→ carry = product / 10 ↓ │ 处理剩余carry: │ ├─→ 若carry>0: │ │ ├─→ result[length] = carry % 10 │ │ ├─→ carry /= 10 │ │ └─→ length++ ↓ 循环结束 ↓ 逆序输出数组内容 ↓ 结束 ``` --- #### 4. 关键点说明 - **数组大小**:100!有158位,需预分配足够空间(如200位)。 - **进位处理**:每次乘法后,进位可能跨越多位(如999×2=1998,进位需分多次处理)。 - **效率优化**:通过`length`变量避免遍历整个数组。 --- #### 5. 结果验证 - **输出示例**:程序会输出完整的158位数字,例如以`933262154439...000000`结尾。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值